方法一:递归
写法一:创建新节点
算法思路解析
该实现采用 递归方式 逐位处理两个链表,并考虑进位 carry:
✨ 步骤拆解
-
递归终止条件:当
l1
,l2
都为空且没有进位(carry == 0
),说明加法结束,返回None
。 -
当前位求和:s = carry + l1.val (如果有) + l2.val (如果有)
-
计算当前节点的值与进位:当前节点值为
s % 10
,进位为s // 10
-
递归构造下一节点:递归调用
addTwoNumbers(l1.next, l2.next, carry)
处理下一位 -
创建当前节点并连接:使用
ListNode(s % 10, next_node)
构造当前节点并返回
class Solution:# l1 和 l2 为当前遍历的节点,carry 为进位def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode], carry=0) -> Optional[ListNode]:if l1 is None and l2 is None and carry == 0: # 递归边界return Nones = carryif l1:s += l1.val # 累加进位与节点值l1 = l1.nextif l2:s += l2.vall2 = l2.next# s 除以 10 的余数为当前节点值,商为进位return ListNode(s % 10, self.addTwoNumbers(l1, l2, s // 10))
时间与空间复杂度分析
时间复杂度:O(max(m, n))
-
每次递归处理一个节点,最多递归
max(m, n)
层(m 和 n 为两个链表的长度)。
空间复杂度:
类型 | 复杂度 | 说明 |
---|---|---|
递归栈空间 | O(max(m, n)) | 每层递归入栈一次 |
结果链表空间 | O(max(m, n) + 1) | 存储最终和(可能有一个额外的进位位) |
⚠️ 注意:这是递归写法,存在函数栈空间占用,若链表极长(如上千位),可能导致栈溢出风险(可改为迭代方式避免)。