题目描述

题解
// 这题不难,但是做出来需要考虑好很多条件。
// 首先创建结果链表res,为了返回完整的链表,我们在res.next中
// 保存结果,到最后的时候直接返回res.next即可。
//
// 定义res链表的指针r,定义l1 l2链表的指针p1 p2。定义进位记录位carry,
// 一旦加法产生进位,将被存入carry中。
//
// 需要记住的是,链表从左往右遍历正好是个位-十位-百位-...从低位到高位
// 的遍历,所以加法运算产生的进位正好用到下一位的加法。
// while循环开始指针右移,基本思想是p1 p2双指针一步步右移,遍历的元素
// 做加法,加出来的当前位存入res链表,进位数记录到carry中用于下一次加法
// 运算。
// int x记录p1.val,如果p1为空则x为0。同理,int y记录p2.val。
// x和y和carry做加法运算,得到sum。sum的高位进位记录到carry,
// sum的低位直接存入r.next.val中。
// p1,p2可以允许一次null,表明已经l1 l2已经遍历完了。
// p1或p2为空之后,p1或p2不再移动。如果非空,指针右移。直到两个链表
// 都被遍历完了,while循环结束。
// r指针也右移。
// while循环结束后,如果carry还有,r后创建新结点存入carry。
// 最后回到表头res返回res.next
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode res = new ListNode(0)
ListNode r = res
ListNode p1 = l1
ListNode p2 = l2
int carry = 0
while (p1 != null || p2 != null) {
int x = (p1 == null) ? 0 : p1.val
int y = (p2 == null) ? 0 : p2.val
int sum = x + y + carry
carry = sum / 10
sum = sum % 10
r.next = new ListNode(sum)
if (p1 != null) p1 = p1.next
if (p2 != null) p2 = p2.next
r = r.next
}
if (carry != 0) {
r.next = new ListNode(carry)
}
return res.next
}
}