返回
用技术导航,步入算法题王国——LeetCode 300 题详解(下)
前端
2024-01-05 22:23:14
前言
在上一篇指南中,我们探索了 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 题系列中的“两数相加”题的解题技巧和多种解法。您可以根据自己的需求选择适合的解法。希望本指南对您有所帮助!