Add two numbers

25 年 6 月 29 日 星期日
476 字
3 分钟

problem

Screenshot 2026-03-06 at 10.28.19 pm
js
/**
 * 递归实现两个逆序存储数字的链表相加
 * @param {ListNode} l1 - 第一个链表的当前遍历节点(逆序存储数字,如 2->4->3 代表 342)
 * @param {ListNode} l2 - 第二个链表的当前遍历节点(逆序存储数字,如 5->6->4 代表 465)
 * @param {number} carry - 上一位相加产生的进位,默认值为 0
 * @return {ListNode} - 返回相加结果的新链表头节点(逆序存储结果,如 7->0->8 代表 807)
 */
var addTwoNumbers = function (l1, l2, carry = 0) {
  // 递归边界条件:两个链表都遍历完,且没有进位时,递归终止,返回 null
  // 这意味着所有位都已处理完毕,无需再创建新节点
  if (l1 === null && l2 === null && carry === 0) {
    return null
  }

  // 初始化当前位的总和为进位值(上一位相加的进位会影响当前位)
  let sum = carry

  // 如果第一个链表当前节点不为空,将其值累加到总和,并移动到下一个节点
  if (l1) {
    sum += l1.val
    l1 = l1.next // 指针后移,准备处理下一位,必须得在这里位移(在l1不为空的情况下)
  }

  // 如果第二个链表当前节点不为空,将其值累加到总和,并移动到下一个节点
  if (l2) {
    sum += l2.val
    l2 = l2.next // 指针后移,准备处理下一位
  }

  // 计算当前位的结果值:总和对 10 取余(如 sum=15,则当前位值为 5)
  const currentVal = sum % 10
  // 计算新的进位:总和除以 10 并向下取整(如 sum=15,则进位为 1)
  const newCarry = Math.floor(sum / 10)

  // 创建当前位的新节点,值为 currentVal
  // 节点的 next 指向递归调用的结果(处理下一位的相加)
  // 递归调用时传入移动后的 l1、l2 和新的进位 newCarry
  return new ListNode(currentVal, addTwoNumbers(l1, l2, newCarry))
}

文章标题:Add two numbers

文章作者:Sirui Chen

文章链接:https://blog.siruichen.me/posts/2add_two_numbers[复制]

最后修改时间:


商业转载请联系站长获得授权,非商业转载请注明本文出处及文章链接,您可以自由地在任何媒体以任何形式复制和分发作品,也可以修改和创作,但是分发衍生作品时必须采用相同的许可协议。
本文采用CC BY-NC-SA 4.0进行许可。