2. 两数相加

142 阅读1分钟

「题目」 

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。

示例

输入:
(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

「题目链接」 

leetcode.cn/problems/ad…