给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出: 7 -> 0 -> 8
原因: 342 + 465 = 807
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
// 题目了说了两链表非空,所以不需要空值判断
ListNode sum = new ListNode(0);
sum.next = null;
ListNode i = sum;
//下面这个循环,将l1和l2两链表对应相加,较长的直接接在sum链表后面
while(true){
i.val = l1.val + l2.val;
if (l1.next == null && l2.next == null) break;
else if (l1.next == null){
i.next = l2.next ;
break;
}else if (l2.next == null){
i.next = l1.next;
break;
}else{
l1 = l1.next;
l2 = l2.next;
i.next = new ListNode(0);
i = i.next;
i.next = null;
}
}
i = sum;
//负责将大于10的结点进行进位处理
while(true){
if(i.val >= 10){
if(i.next != null){
i.val = i.val % 10;//取个位数
i = i.next;
i.val += 1;//应该要知道i.val不会超过19,所以直接进1即可,不需要判断十位
}else{
i.val = i.val % 10;
i.next = new ListNode(1);
i.next.next = null;
break;
}
}else if(i.next == null) break;
else i = i.next;
}
return sum;
}
}
这个题目的本意是模拟大整数相加,是一个链表类问题。题目本身不是很难,链表类的题目最主要是要细心,注意,要保持结果链表尾结点的 next 指针为空。
题目也有注释,应该看起来不困难。整体的思路就是: