No.002:Add Two Numbers
问题:
You are given two linked lists representing two non-negative numbers. 
The digits are stored in reverse order and each of their nodes contain a single
digit. 
Add the two numbers and return it as a linked list.
Example:
Input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Output: 7 -> 0 -> 8
官方难度:
Medium
翻译:
现有2个链表结构,每个节点存储非负整数,每个结点的数字都是个位数且倒序排列,将这2个链表代表的数字相加。
例子:
链表一:2 -> 4 -> 3
链表二:5 -> 6 -> 4
输出链表:7 -> 0 -> 8
额外例子:
链表一:1 -> 5
链表二:8 -> 5
输出链表:9 -> 0 -> 1
- 结点定义已经给了,是单向链表的结点定义:
private static class ListNode {
int val;
ListNode next; ListNode(int x) {
val = x;
}
}ListNode
 - 最初题目给的例子,其实题意并不是特别清晰,一开始我的理解其实是存在问题的。其实题目的要求是(以额外例子为例):1+8=9,放入输出链表的第一个结点;5+5=10,放入第二个结点,产生进位;1放入第三个结点。
 - 分析一下题目的要求,返回的要求是第一个结点,那么就需要2个指针,一个用来操作,一直next,一个始终指向第一个结点,用于return。
 - 需要一个进位的标志位carry,而且没有必要用boolean型的,用int型的更好,可以初始值赋值0,下一次的carry=(num1+num2+carry)/10。
 - 因为可能出现2个输入链表长短不一致的情况,当前结点为null时,赋值0就行了。
 - 引入头结点的概念,因为初始的结点需要赋值,如果初始化为第一个结点的时候,会把大部分循环里的事情先拉出来做一遍,这样代码就会显得很繁琐,引入头结点可以避免这种情况,return的时候记得head.next。
 - 循环退出条件是两个链表当前结点全是null,在退出循环之后需要判断进位的标志位carry,因为可能会多产出一位。
 - 对方法进行入参检查是一个好习惯,但是本方法即使没有入参检查(输入2个null),也不会出错,只会返回null,那就不必写了。
 
解题代码:
     public static ListNode addTwoNumbers(ListNode l1, ListNode l2)     {
         // 头结点
         ListNode head = new ListNode(0), operNode = head;
         // 进位标志
         int carry = 0;
         while (l1 != null || l2 != null) {
             int num1 = l1 == null ? 0 : l1.val;
             int num2 = l2 == null ? 0 : l2.val;
             int sum = num1 + num2 + carry;
             operNode.next = new ListNode(sum % 10);
             carry = sum / 10;
             operNode = operNode.next;
             l1 = l1 == null ? null : l1.next;
             l2 = l2 == null ? null : l2.next;
         }
         // 最后一次相加之后判断标志位
         if (carry == 1) {
             operNode.next = new ListNode(1);
         }
         return head.next;
     }
addTwoNumbers
备注:
1. 鉴于之后有比较多的链表结构的问题,不妨自己实现一下链表。
相关链接:
https://leetcode.com/problems/add-two-numbers/
PS:如有不正确或提高效率的方法,欢迎留言,谢谢!
No.002:Add Two Numbers的更多相关文章
- LeetCode-2: Add Two Numbers
		
[Problem:2-Add Two Numbers] You are given two non-empty linked lists representing two non-negative i ...
 - Q2:Add Two Numbers
		
2. Add Two Numbers 官方的链接:2. Add Two Numbers Description : You are given two non-empty linked lists r ...
 - LeetCode4:Add Two Numbers
		
题目: You are given two linked lists representing two non-negative numbers. The digits are stored in r ...
 - leetcode:Add Two Numbers
		
题目描述:You are given two linked lists representing two non-negative numbers. The digits are stored in ...
 - LeetCode之“链表”:Add Two Numbers
		
题目链接 题目要求: You are given two linked lists representing two non-negative numbers. The digits are stor ...
 - LeetCode第[2]题(Java):Add Two Numbers (链表相加)——Medium
		
题目难度:Medium 题目: You are given two non-empty linked lists representing two non-negative integers. The ...
 - LeetCode OJ:Add Two Numbers (相加链表之数)
		
You are given two linked lists representing two non-negative numbers. The digits are stored in rever ...
 - 面试题:Add Two Numbers(模拟单链表)
		
题干: You are given two non-empty linked lists representing two non-negative integers. The digits are ...
 - LeetCode第二题:Add Two Numbers
		
You are given two non-empty linked lists representing two non-negative integers. The digits are stor ...
 
随机推荐
- TDA - Thread Dump Analyzer (Java线程分析工具)
			
TDA - Thread Dump Analyzer (Java线程分析工具)http://automationqa.com/forum.php?mod=viewthread&tid=2351 ...
 - 提高c++性能的编程技术笔记
			
需要时再创建对象,比如在类中用if new 而不是在构造函数里创建类的成员. 用char 指针而不是string可以节省构造和析构string的开销. 虚函数无法内联的性能损失.
 - sizeof()用法汇总
			
sizeof()功能:计算数据空间的字节数 1.与strlen()比较 strlen()计算字符数组的字符数,以"\0"为结束判断,不计算为'\0'的数组元素. ...
 - 如何在wp8 中调试cocos2dx c++ 代码
			
有的时候在win32上运行良好的cocos2dx程序移植到wp8的时候就出了问题,我们想把断点放到c++代码中,需要设置一下VS 2012 右击项目属性 把ui任务 设置为仅限本机 即可.
 - UNIX环境高级编程笔记之文件I/O
			
一.总结 在写之前,先唠几句,<UNIX环境高级编程>,简称APUE,这本书简直是本神书,像我这种小白,基本上每看完一章都是“哇”这种很吃惊的表情.其实大概三年前,那会大三,我就买了这本书 ...
 - 检索 COM 类工厂中 CLSID 为 {13C28AD0-F195-4319-B7D7-A1BDAA329FB8} 的组件时失败,原因是出现以下错误: 80040154
			
异常类型:COMException 异常消息:检索 COM 类工厂中 CLSID 为 {13C28AD0-F195-4319-B7D7-A1BDAA329FB8} 的组件时失败,原因是出现以下错误: ...
 - 又是一个小正则replace
			
var a = "http://www.xx.com?id=111&-deb"; var b = "http://www.xx.com?-deb&id=1 ...
 - 为什么移动Web应用程序很慢(译)
			
前些日子,看到Herb Sutter在自己的博客中推荐了一篇文章<Why mobile web apps are slow>,在推荐里他这样写道: “I don’t often link ...
 - Socket.IO 1.0 正式发布,快速可靠的实时引擎
			
Socket.IO 是目前 Web 领域最火的实时引擎,用于实现基于事件的双向实时的通信.它适用于任何平台,浏览器或设备,专注于可靠性和速度.您可以将数据推送到客户端,并获得实时的计数,日志或图表. ...
 - Xcode_cocoaPods-超详细傻瓜式安装教程
			
一.Ruby环境: 下载cocoaPods需要Ruby环境. 1. Mac os 10.5以后只带Ruby环境.为了确保万无一失还是查看一下吧. 打开终端 (1)ruby -v (2)更新tuby g ...