给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
来源:力扣(LeetCode)
链接:第二题
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
个人解法
因为需要相加的两个数逆序输入,逆序输出。
- 考虑进位的话,每一位都可能有进位,利用一个标志位来记录上一个相加的进位即可
- 考虑结果的保存
- 官方给的题解中创建了一个新的链表作为返回的结果
- 个人当时考虑时,使用了
l1
作为最终的结果
这时,两种情况:
1.l1
比l2
长
- 如果l1
有进位,则处理进位
- 如果l1
没有进位,则直接返回结果
2.l2
比l1
长
- 每次计算完后给l1
创建新节点并赋值
- 考虑最后一位进位
如果最后一位有进位的话,需要新建结点,再进行赋值进位数的操作。
- 个人问题出现地方:
-
由于当我们通过链表的指针来指向链表节点时,如果我们指到的是节点的末尾
null
,此时直接赋值是不可以的。例如像下面这样ListNode before_node = l1; // 用来遍历到l1链表的末尾 while (l1 != null) { before_node = l1; l1 = l1.next; } // 此时while循环出来的 l1 , 便应该是指向了链表的最末尾 // 此时before_node 指向的是最后一个有数据的结点,在其后面插入即可 before_node.next = new ListNode(0);
图示:
- 直接遍历到末尾,修改null节点其实无效
需要找到末尾之前的结点,在让其指向新节点
最终代码如下 - 直接遍历到末尾,修改null节点其实无效
-
/**
* 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 res_list = l1;
ListNode before_l1 = null;
// 选择l1为最后的结果
// 进位标志
int res = 0;
// l1 和 l2都不为空时,累加到l1上
while (l1 != null && l2 != null) {
// 加上上一位进位, 计算加法结果,若 >= 10, 则减去10, 进位标志为1, 否则进位标志为0
int add_res = l1.val + l2.val + res;
if (add_res >= 10) {
add_res -= 10;
res = 1;
} else {
res = 0;
}
// 赋值结果
l1.val = add_res;
// 为后续链接新节点做准备
before_l1 = l1;
// 赋值为下一个结点
l1 = l1.next;
l2 = l2.next;
}
// 因为是以l1为结果的, 所以如果进位为1, 才有必要继续运算, 否则没有必要运算
if (res == 1) {
while (l1 != null) {
// System.out.println("l1不为空");
int add_res = res + l1.val;
if (add_res >= 10) {
add_res -= 10;
res = 1;
} else {
res = 0;
}
l1.val = add_res;
// 为后续链接新节点做准备
before_l1 = l1;
l1 = l1.next;
}
}
// 如果l1先为空, l2不为空的话
while (l2 != null) {
// System.out.println("l2不为空");
// 若l1为空,则新建l1结点
if (l1 == null) {
// System.out.println("l1为空, 新建结点");
before_l1.next = new ListNode(l2.val);
l1 = before_l1.next;
before_l1 = l1;
}
// 如果有进位
if (res == 1) {
// System.out.println("有进位");
int add_res = res + l2.val;
if (add_res >= 10) {
add_res -= 10;
res = 1;
} else {
res = 0;
}
l1.val = add_res;
// System.out.println(", val = " + l1.val);
}
l1 = l1.next;
l2 = l2.next;
}
// 如果还有进位
if (res == 1) {
before_l1.next = new ListNode(res);
}
return res_list;
}
}