📌  相关文章
📜  将链表表示的两个数字相加 | 2套(1)

📅  最后修改于: 2023-12-03 15:25:22.495000             🧑  作者: Mango

将链表表示的两个数字相加

在链表中表示一个数字的方法是将数字的每个位数分别存储在一个单独的节点中,其中最低有效位存储在第一个节点上。例如,数字 3,274 在链表中表示为 [4, 7, 2, 3]

现在给定两个表示为链表的数字,设计一个函数将它们相加并以链表的形式返回结果。

示例
输入:l1 = [2, 4, 3], l2 = [5, 6, 4]
输出:[7, 0, 8]
解释:342 + 465 = 807.
解法

这道题本质上是高精度加法,只不过把数字放到了链表中。我们只需要从两个链表的头节点开始,对每个对应的数字进行相加,并记录下进位。最后,如果有进位,则需要添加一位数字。

具体实现可以使用一个哑节点作为返回链表的头节点,并用一个指针指向其后续节点,不断更新其后续节点的值,并记录进位,直到指向的两个链表都为空。

代码如下:

def addTwoNumbers(l1, l2):
    dummy = ListNode(0)
    cur = dummy
    carry = 0
    while l1 or l2 or carry:
        sum = (l1.val if l1 else 0) + (l2.val if l2 else 0) + carry
        carry = 1 if sum > 9 else 0
        cur.next = ListNode(sum % 10)
        cur = cur.next
        l1 = l1.next if l1 else None
        l2 = l2.next if l2 else None
    return dummy.next

时间复杂度为 $O(\max(m,n))$,其中 $m$ 和 $n$ 分别为两个链表的长度。空间复杂度为 $O(\max(m,n))$。

另外一种写法

虽然这题相对简单,但是还是可以有多种解法。这里介绍一种递归的写法,代码如下:

def addTwoNumbers(l1, l2, carry=0):
    if not l1 and not l2 and not carry:
        return None
    sum = (l1.val if l1 else 0) + (l2.val if l2 else 0) + carry
    carry = 1 if sum > 9 else 0
    res_node = ListNode(sum % 10)
    l1 = l1.next if l1 else None
    l2 = l2.next if l2 else None
    res_node.next = addTwoNumbers(l1, l2, carry)
    return res_node

时间复杂度和空间复杂度与上面的解法相同。递归写法相对较为简洁,但是可能会带来额外的内存开销。