返回

剑指Offer第二题,带你轻松理解数组中的逆序对问题

前端

概述

LeetCode 445题:两数相加 II 是一个经典的链表相加问题,需要将两个非空链表表示的非负整数相加,并将结果以新链表的形式返回。该问题考查了链表操作、数字运算和递归等基本编程技巧。

算法

以下是解决LeetCode 445题:两数相加 II 的算法

  1. 初始化结果链表 :创建一个新的链表来存储相加后的结果。

  2. 反转两个链表 :将两个输入链表反转,以便最高位数字位于链表开始位置。

  3. 逐位相加 :将两个反转后的链表逐个节点进行相加,并将进位存储在变量中。

  4. 处理进位 :如果在相加过程中产生了进位,则将其添加到结果链表的开头。

  5. 反转结果链表 :将相加后的结果链表再次反转,恢复到正常顺序。

  6. 返回结果链表 :将反转后的结果链表返回作为最终答案。

代码实现

以下是解决LeetCode 445题:两数相加 II 的Python代码实现:

def addTwoNumbers(l1, l2):
    # 反转两个链表
    l1 = reverseList(l1)
    l2 = reverseList(l2)

    # 创建结果链表
    dummy = ListNode(0)
    current = dummy

    # 逐位相加
    carry = 0
    while l1 or l2 or carry:
        val1 = l1.val if l1 else 0
        val2 = l2.val if l2 else 0
        total = val1 + val2 + carry
        carry = total // 10
        current.next = ListNode(total % 10)
        current = current.next
        l1 = l1.next if l1 else None
        l2 = l2.next if l2 else None

    # 反转结果链表
    return reverseList(dummy.next)

# 反转链表的函数
def reverseList(head):
    prev = None
    current = head
    while current:
        next_node = current.next
        current.next = prev
        prev = current
        current = next_node
    return prev

复杂度分析

  • 时间复杂度:O(n),其中n是两个链表的总长度。
  • 空间复杂度:O(n),因为我们创建了一个新的链表来存储结果。

总结

LeetCode 445题:两数相加 II 是一个经典的链表相加问题,考查了链表操作、数字运算和递归等基本编程技巧。通过使用反转链表和逐位相加等技巧,我们可以轻松解决该问题。