题目描述
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/af881e9f98e9b5dbadffe0b1b4d376a8.png)
// 力扣
// 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序
// 的方式存储的,并且每个节点只能存储 一位 数字。
// 请你将两个数相加,并以相同形式返回一个表示和的链表。
// 你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
题解
// 这题不难,但是做出来需要考虑好很多条件。
// 首先创建结果链表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;
}
}