题目难度
中等
题目描述
给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
提示
- 每个链表中的节点数在范围
[1, 100]
内0 <= Node.val <= 9
- 题目数据保证列表表示的数字不含前导零
解题思路
方法1:模拟加法运算,较短的链表补零,同一位置相加后保存进位即可。
方法2:递归法,每次计算第一个位置与进位的相加即可。
方法1代码
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
# res结果,p当前
p=res=ListNode()
# 进位
m=0
while l1 or l2:
x=l1.val if l1 else 0
y=l2.val if l2 else 0
# 当前位相加后的结果
d=x+y+m
# 求进位与当前位结果
p.next=ListNode(d%10)
m=d//10
if l1: l1=l1.next
if l2: l2=l2.next
p=p.next
# 注意最后需要判断是否有最高位进位
if m: p.next=ListNode(m)
return res.next
方法2代码
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
def helper(l1,l2,m):
if not l1 and not l2:
# 判断最高位是否有进位并终止递归
if m:
return ListNode(m)
else:
return
l1=l1 if l1 else ListNode(0)
l2=l2 if l2 else ListNode(0)
# 当前位相加后的结果
d=l1.val+l2.val+m
# 求进位与当前位结果
node=ListNode(d%10)
m=d//10
# 计算下一个位置
node.next=helper(l1.next,l2.next,m)
return node
return helper(l1,l2,0)
方法1复杂度分析
时间复杂度:O(max(m,n)),其中 m 和 n 分别为两个链表的长度。我们要遍历两个链表的全部位置,而处理每个位置只需要 O(1) 的时间。
空间复杂度:O(1),注意返回值不计入空间复杂度。