返回

剑指 Offer II 025:链表中的两数相加——LeetCode 题解

后端

引言

在计算机科学领域,链表是一种重要的数据结构,广泛应用于各种场景中。LeetCode 是一家在线编程题库,提供大量算法和数据结构相关的编程题目,其中「剑指 Offer II 025. 链表中的两数相加」是难度为「中等」的一道题目。

问题

给定两个非空的链表 l1l2,它们分别代表两个非负整数。数字最高位位于链表开始位置。每个节点只存储一位数字。要求将这两个数相加并返回一个新的链表,作为和的表示。

解题思路

要解决这个问题,我们可以遵循以下步骤:

  1. 反转链表: 为了方便计算,我们将两个链表反转,这样最高位就位于链表的头部。
  2. 逐位相加: 从两个链表的头部开始,逐个节点相加,如果和大于或等于 10,则将进位记为 1,并将和对 10 取余。
  3. 处理进位: 如果在相加过程中产生了进位,则将进位添加到新链表的头部。
  4. 构建新链表: 将相加结果逐个添加到新链表中。

代码示例

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
        sum = val1 + val2 + carry
        carry = sum // 10
        current.next = ListNode(sum % 10)
        current = current.next
        l1 = l1.next if l1 else None
        l2 = l2.next if l2 else None

    # 返回新链表
    return 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(max(m, n)),其中 m 和 n 分别是两个链表的长度。
  • 空间复杂度: O(max(m, n)),因为我们创建了一个新链表来存储结果。

总结

通过对链表反转、逐位相加和处理进位的操作,我们可以有效地解决「链表中的两数相加」问题。这种解题方法不仅可以应用于 LeetCode 中的特定题目,还具有广泛的实用性,可以帮助我们理解链表操作和算法设计的基本原理。