/** * @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;};
评论