本题解采用了栈的数据结构处理链表中的数字。首先,将两个链表的数字遍历并压入两个栈中,这样栈顶就代表了数字的最低位。接着,利用栈的后进先出特性,从栈顶开始逐位相加,处理进位。每次相加后,新建一个节点,将其链接到当前结果链表的头部,这样可以保持加法的顺序正确。如果最终还有进位,需要再添加一个节点处理这个进位。这种方法不需要修改原链表,符合题目的进阶要求。
时间复杂度: O(n + m)
空间复杂度: O(n + m)
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
n1, n2 = [], [] # 用于存储两个链表中的数值
while l1: # 遍历链表l1,将所有数值压栈
n1.append(l1.val)
l1 = l1.next
while l2: # 遍历链表l2,将所有数值压栈
n2.append(l2.val)
l2 = l2.next
flag = 0 # 初始化进位标志
res = None # 初始化结果链表的头节点
while n1 or n2 or flag != 0: # 当栈不为空或者还有未处理的进位时继续处理
s1 = n1.pop() if n1 else 0 # 取出n1的栈顶元素,如果栈为空则用0替代
s2 = n2.pop() if n2 else 0 # 取出n2的栈顶元素,如果栈为空则用0替代
ss = (s1 + s2 + flag) # 计算当前位的和以及进位
flag = ss // 10 # 更新进位
curnode = ListNode(ss % 10) # 创建新的节点
curnode.next = res # 将新节点链接到结果链表的头部
res = curnode # 更新结果链表的头部
return res # 返回结果链表的头节点