该题解采用了逐位相加的方法来处理两个链表表示的数字的加法。首先,创建一个哑节点(dummy node)作为新链表的头部,用于简化边界情况的处理。两个指针p1和p2分别遍历两个链表,同时一个变量carry用于存储进位。在每一步中,将p1和p2指向的节点的值(如果存在)和carry相加,计算得到的总和如果大于等于10,则设置进位carry为1,并将总和减去10;否则,进位carry设为0。然后创建一个新节点,其值为当前位的结果,并将其加到结果链表的末尾。遍历继续,直到两个链表都完全遍历完且没有进位。最后,返回哑节点的下一个节点,即结果链表的头节点。
时间复杂度: O(max(m, n))
空间复杂度: O(max(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:
dummy = ListNode(0) # 创建哑节点作为结果链表的头部
p1 = l1 # 链表1的当前节点
p2 = l2 # 链表2的当前节点
p = dummy # 结果链表的当前节点
carry = 0 # 进位
while p1 or p2 or carry != 0:
val = 0
if p1:
val += p1.val # 添加链表1的当前节点值
p1 = p1.next # 移动到链表1的下一个节点
if p2:
val += p2.val # 添加链表2的当前节点值
p2 = p2.next # 移动到链表2的下一个节点
if carry != 0:
val += carry # 加上前一位的进位
if val >= 10:
carry = 1 # 设置新的进位
val -= 10 # 计算当前位的值
else:
carry = 0 # 清除进位
p.next = ListNode(val) # 创建新节点并连接到结果链表
p = p.next
return dummy.next # 返回结果链表的头节点