
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))
}