考点:链表
题目
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
思路
注意一下链表题比较常见的一个小技巧:用一个dummyHead记录结果链表的初始节点
var addTwoNumbers = function(l1, l2) {
// 定位结果链表的第一位
const dummyHead = new ListNode();
dummyHead.next = l1;
// 两个遍历指针
let cur1 = l1, cur2 = l2;
let c = 0; // 进位
while(cur1 && cur2) {
let sum = cur1.val + cur2.val + c;
cur1.val = Math.floor(sum % 10); // 保留值
c = Math.floor(sum / 10); // 进位
if(!cur1.next || !cur2.next) {
break;
}
cur1 = cur1.next;
cur2 = cur2.next;
}
// 如果cur1比较短,把cur2长的部分接到cur1后面
if(!cur1.next) {
cur1.next = cur2.next;
cur2 = null;
}
// 继续遍历cur1
while(cur1.next) {
cur1 = cur1.next;
let sum = cur1.val + c;
cur1.val = Math.floor(sum % 10);
c = Math.floor(sum / 10);
}
// 如果数字首位(即链表末位的两个数字)相加仍有进位,再添加一个链表节点
if(c !== 0) {
const last = new ListNode(1);
cur1.next = last;
}
return dummyHead.next;
};