给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储一位数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
由于整数的每位数字是由逆序的方式被链表存储,因此第一个想法是用栈,将两个整数还原之后进行相加,之后再根据相加之后的结果创建新的链表。但是这么做太过麻烦,就想找别的方式。
根据示例一的图像我们可以发现,即便他们是逆序的,但结果也是逆序的,因此直接正向求解即可。就拿示例一举例:2 + 5 = 7, 4 + 6 = 10, 3 + 4 + 1(上一位的进1) = 8,完全符合结果。
(1)两个整数长度不一定相同。因此,当其中一个整数被遍历完之后,可以看作它之后的位数都为0,另外一个整数只需要考虑和进位相加即可。
(2)当两个整数都遍历完之后,可能还有进位,要考虑这种情况。
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode p = l1, q = l2;
ListNode res = new ListNode(0);
ListNode temp = res;
int before = 0; //用于标记是否有进位
while (p != null && q != null) { //两个整数都有位数
int num = p.val + q.val + before; //求和,记得要加上进位
before = num < 10 ? 0 : 1; //如果当前和大于等于10,说明有进位,before为1;反之为0
temp.next = new ListNode(num %10); //num%10得到的就是最终当前结果,建立新的节点加到res后面
temp = temp.next;
p = p.next; //下一位
q = q.next; //下一位
}
while (p != null) { //整数p还没遍历完,而整数q已经结束
int num = p.val + before; //此时只需要p的值与进位相加
before = num < 10 ? 0 : 1;
temp.next = new ListNode(num %10);
temp = temp.next;
p = p.next;
}
while (q != null) { //整数q还没遍历完,而整数p已经结束
int num = q.val + before; //此时只需要q的值与进位相加
before = num < 10 ? 0 : 1;
temp.next = new ListNode(num %10);
temp = temp.next;
q = q.next;
}
if(before == 1) { //两个数都遍历结束但还有进位
temp.next = new ListNode(1); //要把进位补上
}
return res.next; //res指向的是初始化建立的值为0的节点,res.next才是最终结果的第一位,因此要返回res.next
}