
在

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例 1:

输入:l1 = [2,4,3], l2 = [5,6,4] 输出:[7,0,8] 解释:342 + 465 = 807.
示例 2:
输入:l1 = [0], l2 = [0] 输出:[0]
示例 3:
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9] 输出:[8,9,9,9,0,0,0,1]
提示:
- 每个链表中的节点数在范围
[1, 100]
内 0 <= Node.val <= 9
- 题目数据保证列表表示的数字不含前导零
答案:
var addTwoNumbers = function(l1, l2) {
let item = {}
let final = item
let a = 0
while (l1 || l2 || a) {
let l = l1?.val ?? 0
let r = l2?.val ?? 0
a += (l + r)
l1 = l1?.next
l2 = l2?.next
item.next = {val: a%10, next: null}
a = ~~(a / 10)
item = item.next
}
return final.next
};
解题过程:
- 创建一个空的对象item,作为链表的第一个节点
- 存储初始item的引用为final,作为链表的头节点,用于最后返回结果
- 创建一个变量a,用来记录上一次运算结果是否超出了10,如果超出需要在下一组节点计算的时候 + 1作为进位
- 使用while遍历链表,只要满足三个条件中的一个,l1还有节点/l2还有节点/a也就是上一次计算超过了10,满足这三个中的一个就继续进行计算
- 对l1和l2进行规范化处理,如果没有值就给个默认值0,用来处理两个链表长度不一致,或者两个链表一致但是最后一位相加超过了10的情况
- 计算 l1 + l2 + a(上一轮是否大于10),给新节点赋值结果%10,也就是保留一位数,给a赋值结果是否大于10,给两个链表赋值next节点,给item赋值下一个节点
- 循环到结束即可