题目
给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。
你可以假设除了数字 0 之外,这两个数字都不会以零开头。
进阶:
如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。
示例:
输入:(7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 8 -> 0 -> 7
解题思路
一般需要逆序处理的都需要栈,这里就是分别遍历两个链表,把数字存进对应的栈里。当至少有一个栈不为空时,每次从栈顶取出元素相加,并判断需不需要进位,将它添加到结果链表中。这里用到了链表的头插法:
p.next = head.next
head.next = p
复杂度分析:
时间复杂度:O(max(m, n)),其中 m 与 n 分别为两个链表的长度。我们需要遍历每个链表。
空间复杂度:O(m + n),其中 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:
stack1 = []
stack2 = []
while l1 != None:
stack1.append(l1.val)
l1 = l1.next
while l2 != None:
stack2.append(l2.val)
l2 = l2.next
# 进位变量
sum = 0
# 链表头节点
head = ListNode()
while stack1 or stack2 or sum>0:
if stack1:
sum += stack1.pop()
if stack2:
sum += stack2.pop()
# 头插法
p = ListNode(sum%10)
p.next = head.next
head.next = p
sum //= 10
return head.next