445 两数相加II
给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
进阶:
如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。
示例:
输入:(7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 8 -> 0 -> 7
解法
- 创建a,b两个栈,时间复杂度O(M+N),空间复杂度O(M+N)
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
pre = None
a,b = [],[]
while l1:
a.append(l1.val)
l1 = l1.next
while l2:
b.append(l2.val)
l2 = l2.next
extra = 0
while a or b or extra:
if a:
x = a.pop()
else:
x = 0
if b:
y = b.pop()
else:
y = 0
node = ListNode((x+y+extra)%10)
extra = (x+y+extra)//10
node.next = pre
pre = node
return pre
- 将a,b两个非空链表反转,然后按照第2题解法,再反转一次就可输出结果。实际上,该方法由第一种方法发展而来。
输入:(7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 8 -> 0 -> 7
7 -> 2 -> 4 -> 3 反转 3 -> 4 -> 2 -> 7
5 -> 6 -> 4 反转 4 -> 6 -> 5
按第2题方法相加,得
7 -> 0 -> 8 -> 7。 反转得
7 -> 8 -> 0 -> 7