返回
剑指 Offer II 025:链表中的两数相加——LeetCode 题解
后端
2023-12-22 09:19:58
引言
在计算机科学领域,链表是一种重要的数据结构,广泛应用于各种场景中。LeetCode 是一家在线编程题库,提供大量算法和数据结构相关的编程题目,其中「剑指 Offer II 025. 链表中的两数相加」是难度为「中等」的一道题目。
问题
给定两个非空的链表 l1
和 l2
,它们分别代表两个非负整数。数字最高位位于链表开始位置。每个节点只存储一位数字。要求将这两个数相加并返回一个新的链表,作为和的表示。
解题思路
要解决这个问题,我们可以遵循以下步骤:
- 反转链表: 为了方便计算,我们将两个链表反转,这样最高位就位于链表的头部。
- 逐位相加: 从两个链表的头部开始,逐个节点相加,如果和大于或等于 10,则将进位记为 1,并将和对 10 取余。
- 处理进位: 如果在相加过程中产生了进位,则将进位添加到新链表的头部。
- 构建新链表: 将相加结果逐个添加到新链表中。
代码示例
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 中的特定题目,还具有广泛的实用性,可以帮助我们理解链表操作和算法设计的基本原理。