chencl1986 / Blog

Welcome to lee's blog.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

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

chencl1986 opened this issue · comments

原题链接:
https://leetcode.cn/problems/add-two-numbers/

解题思路:

  1. 两位相加可能大于等于10,需要进位,因此使用plus存储进位到下一位的1
  2. 利用递归,每次调用都计算l1.val + l2.val + plus之和sum,并创建一个新节点new ListNode(sum % 10),链接到新链表上。
  3. 递归需要传入当前链表的前一个节点prev,用于连接当前节点。
/**
 * @param {ListNode} l1
 * @param {ListNode} l2
 * @return {ListNode}
 */
var addTwoNumbers = function (l1, l2) {
  // 递归创建链表
  function recursion(
    prev, // 链表的上一个节点
    l1, // l1的当前节点
    l2, // l2的当前节点
    plus, // 是否有进位
  ) {
    // 如果l1和l2都为null,表示它们都已经加完
    if (!l1 && !l2) {
      // 查看是否还有进位需要处理,此时plus可能为1
      if (plus) {
        prev.next = new ListNode(plus)
      }

      // l1、l2、plus都处理完后,终止递归
      return
    }

    // 取l2和l2的值,如果l1或l2为null,则值设置为0
    const val1 = l1 ? l1.val : 0
    const val2 = l2 ? l2.val : 0
    // 求l1、l2、plus的值之和
    const sum = val1 + val2 + plus
    // 如果sum>=10,表示需要进位,plus为1
    plus = sum >= 10 ? 1 : 0
    // 创建当前节点,将其连接到prev.next,其值为sum%10,因为当前位只需要存储个位数
    prev.next = new ListNode(sum % 10)

    // 将prev、l1、l2都向后移动一位,继续递归计算下一个节点的值之和
    recursion(prev.next, l1 && l1.next, l2 && l2.next, plus)
  }

  // 创建一个dummy节点,作为dummy.next连接到新链表的头节点
  let dummy = new ListNode(null)
  recursion(dummy, l1, l2, 0)

  return dummy.next
}