/**
* @param {ListNode} l1
* @param {ListNode} l2
* @return {ListNode}
*/
var addTwoNumbers = function (l1, l2) {
let dummy = new ListNode(); // 创建虚拟节点,dummy.next指向新链表的头结点
let node = dummy; // 使用node缓存新链表的每个节点
let plus = 0; // 用于存储出现进位时,所需家数
// 不断迭代,直到两个链表都清空
while (l1 || l2) {
// 创建一个新节点,用于存储结果
// 在循环开始时创建,避免迭代结束时,多创建出一个节点
node.next = new ListNode();
// 将node向前移动一位,新的值存储在当前节点
node = node.next;
// 缓存两个节点的值,节点为空时,值为0
const x = l1 ? l1.val : 0
const y = l2 ? l2.val : 0
// 计算当前位置两数相加之和,如果上一位之和出现进位,plus为1
const res = x + y + plus;
// 如果结果大于10,当前节点仅存储一位数字
if (res >= 10) {
// 存储个位数
node.val = res - 10;
// 将进位数字缓存,供下次迭代使用
plus = 1;
} else {
// 结果小于10,直接存储即可
node.val = res;
// 将进位数字置0
plus = 0;
}
// 将两个链表向后移动一位
l1 && (l1 = l1.next);
l2 && (l2 = l2.next);
}
// 如果还需要进位,则为链表创建一个值为1的新节点
if (plus) {
node.next = new ListNode(1);
}
// 将链表返回,dummy.next指向的是新链表的头结点
return dummy.next;
};
评论