题目
https://leetcode-cn.com/problems/add-two-numbers/.
提示:以下是思路
一、分析具体情况
两个链表元素进行相加,生成一个新的链表,默认每个元素保存一位,大于一位数的值需要进行进位处理。
-
两个链表长度相同
-
两个链表长度不同
-
两个元素相加之和大于9需要进位。
二、具体情况操作
1.链表长度相同
按照简单的思路移动链表元素,将其值相加,赋值给新建的链表元素。
代码如下(示例):
let val1 = l1.val;
let val2 = l2.val;
total += val1 + val2;
l1 = l1.next;
l2 = l2.next;
2.链表长度不同
- 相加结束条件
当两个链表的长度不相同时,若按照上一步的操作会存在一个链表的所有元素已经相加完成了,链表移动到了null的位置,但另外一个链表还没有操作完所有的元素,并没有走到null的位置。所以,对元素操作结束的条件应该为两个链表都为空才停止操作。 - 为空链表如何于不为空链表的值进行相加操作
可以判断,若当前链表为空则赋为0,并且在移动链表元素的时候进行判断,若当前为空代表链表元素都遍历完成不再进行移动操作。
代码如下(示例):
while (l1 || l2) {
let val1 = l1!=null ? l1.val : 0;
let val2 = l2!=null ? l2.val : 0;
total += val1 + val2;
sum.next = new ListNode(total);
total = total>= 10 ? 1 : 0;
sum = sum.next;
if (l1) {
l1 = l1.next;
}
if (l2) {
l2 = l2.next;
}
}
3.进位情况
分析进位不难发现,默认每个元素保存一位的值,最大和为18。若和大于9,则将其除以10的余数保存,中间变量加1累加到下次元素求和中。需要注意的是,当两个链表都为空时,若保存进位值的中间变量不为0,则还需要继续操作,将进位的值保存到新的链表中。
最终代码:
var addTwoNumbers = function(l1, l2) {
let header = new ListNode(0, undefined);
let sum = header;
let total = 0;
while (total || l1 || l2) {
let val1 = l1!=null ? l1.val : 0;
let val2 = l2!=null ? l2.val : 0;
total += val1 + val2;
sum.next = new ListNode(total%10);
total = total>= 10 ? 1 : 0;
sum = sum.next;
if (l1) {
l1 = l1.next;
}
if (l2) {
l2 = l2.next;
}
}
return header.next;
};
}