「题目」
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。
示例
输入:
(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:
7 -> 0 -> 8
原因:
342 + 465 = 807
解题思路
解决这个问题的关键是链表的遍历和数字的逐位相加,包括进位处理。我们从两个链表的头节点开始,对应位置的数相加,如果超过10则记住进位,下一位相加时要加上这个进位。
代码实现
class Solution:
def addTwoNumbers(self, l1, l2):
# 创建虚拟头结点,这将帮助我们简化边界条件的处理
dummy_head = ListNode(0)
current = dummy_head
carry = 0
# 遍历两个链表,直到它们都结束
while l1 or l2 or carry:
val1 = (l1.val if l1 else 0)
val2 = (l2.val if l2 else 0)
carry, out = divmod(val1 + val2 + carry, 10)
# 创建新节点并将其链接到结果链表的末尾
current.next = ListNode(out)
current = current.next
# 移动到下一个节点
if l1:
l1 = l1.next
if l2:
l2 = l2.next
# 返回虚拟头结点的下一个节点,即结果链表的头结点
return dummy_head.next
使用方法
# 创建链表节点
node1 = ListNode(3)
node1 = ListNode(4, node1)
node1 = ListNode(2, node1)
node2 = ListNode(4)
node2 = ListNode(6, node2)
node2 = ListNode(5, node2)
# 计算结果
solution = Solution()
result = solution.addTwoNumbers(node1, node2)
# 打印结果
while result:
print(result.val, end=" ")
result = result.next
输出结果
7 0 8