2. 两数相加

LeeCode 原题链接 题目

实现思路

  • 数字按逆序存储,说明链表的头节点是个位,依次往后是十位、百位等。
  • 从头节点开始,依次相加对应位置的数字,并考虑进位。
  • 需要处理链表长度不一致的情况,以及最后可能存在的进位。

代码实现

function ListNode(val, next) {
  this.val = val === undefined ? 0 : val;
  this.next = next === undefined ? null : next;
}

var addTwoNumbers = function (l1, l2) {
  // 进位
  let curry = 0;
  // 虚拟节点,方便处理结果链表
  let dummy = new ListNode();
  // 指针,用来遍历
  let pointer = dummy;

  while (l1 || l2 || curry) {
    // 计算当前位的和,考虑链表长度不一致的情况
    const sum = (l1 ? l1.val : 0) + (l2 ? l2.val : 0) + curry;
    // 更新进位和当前位的值
    curry = Math.floor(sum / 10);
    // 当前位的值是 sum 对 10 取模
    const val = sum % 10;
    // 创建新节点并连接到结果链表
    pointer.next = new ListNode(val);
    // 移动指针
    pointer = pointer.next;

    // 移动 l1 和 l2 的指针
    l1 = l1 ? l1.next : null;
    l2 = l2 ? l2.next : null;
  }

  // 返回结果链表的头节点
  return dummy.next;
};

// [2,4,3] + [5,6,4]
const l1 = new ListNode(2, new ListNode(4, new ListNode(3)));
const l2 = new ListNode(5, new ListNode(6, new ListNode(4)));
console.log(addTwoNumbers(l1, l2));