LeetCode题解:2. 两数相加,迭代,JavaScript,详细注释

213 阅读1分钟

原题链接:2. 两数相加

解题思路:

  1. 使用一个新链表存储结果,node代表新链表的每个节点。
  2. 创建一个dummy节点,dummy.next指向新链表的头结点。
  3. 使用plus变量,缓存两个值加和后,需要进位的结果,可为01
  4. 同时遍历l1l2,将其想加结果存储在node中,node.val = l1.val + l2.val + plus
/**
 * @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;
};