原题链接:
https://leetcode.cn/problems/add-two-numbers/
解题思路:
- 两位相加可能大于等于10,需要进位,因此使用
plus
存储进位到下一位的1
。 - 利用递归,每次调用都计算
l1.val + l2.val + plus
之和sum
,并创建一个新节点new ListNode(sum % 10)
,链接到新链表上。 - 递归需要传入当前链表的前一个节点
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
}
网友评论