返回

用技术导航,步入算法题王国——LeetCode 300 题详解(下)

前端

前言

在上一篇指南中,我们探索了 LeetCode 300 题系列中的“两数相加”问题。本指南将继续深入研究这道题,为您带来更详细的解法讲解和思维导图。

二、解法总览(思维导图)

为了让您对“两数相加”题的解题思路有更直观的理解,我们绘制了一张思维导图。思维导图中包含了多种解法,以及每种解法的优缺点。

[思维导图链接]

三、全部解法

1. 方案 1

1) 代码:

def addTwoNumbers(l1, 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

2) 复杂度分析:

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

3) 优点:

  • 代码简单易懂,易于实现。
  • 可以处理链表中包含负数的情况。

4) 缺点:

  • 对于非常长的链表,时间复杂度和空间复杂度都会很高。

2. 方案 2

1) 代码:

def addTwoNumbers(l1, l2):
    num1 = 0
    num2 = 0
    multiplier = 1

    while l1:
        num1 += l1.val * multiplier
        multiplier *= 10
        l1 = l1.next

    multiplier = 1

    while l2:
        num2 += l2.val * multiplier
        multiplier *= 10
        l2 = l2.next

    sum = num1 + num2
    result = ListNode(0)
    current = result

    while sum > 0:
        current.next = ListNode(sum % 10)
        current = current.next
        sum //= 10

    return result.next

2) 复杂度分析:

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

3) 优点:

  • 代码简洁,易于理解和实现。
  • 可以处理链表中包含负数的情况。

4) 缺点:

  • 对于非常长的链表,时间复杂度和空间复杂度都会很高。

3. 方案 3(方案 2 的优化)

1) 代码:

def addTwoNumbers(l1, l2):
    num1 = 0
    num2 = 0
    multiplier = 1

    while l1:
        num1 += l1.val * multiplier
        multiplier *= 10
        l1 = l1.next

    multiplier = 1

    while l2:
        num2 += l2.val * multiplier
        multiplier *= 10
        l2 = l2.next

    sum = num1 + num2
    dummy = ListNode(0)
    current = dummy

    while sum > 0:
        current.next = ListNode(sum % 10)
        current = current.next
        sum //= 10

    return dummy.next

2) 复杂度分析:

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

3) 优点:

  • 代码简洁,易于理解和实现。
  • 可以处理链表中包含负数的情况。
  • 与方案 2 相比,该方案在空间复杂度上有所优化。

4) 缺点:

  • 对于非常长的链表,时间复杂度和空间复杂度仍然很高。

结语

通过本指南,您已经掌握了 LeetCode 300 题系列中的“两数相加”题的解题技巧和多种解法。您可以根据自己的需求选择适合的解法。希望本指南对您有所帮助!