返回
从零开始,深入剖析 LeetCode 2 题:非负整数相加的巧妙解法
见解分享
2024-01-25 05:34:58
引言
在计算机科学领域,算法和数据结构无疑是重中之重。它们是解决问题、开发软件的基础,同时也是程序员必备的技能。LeetCode 作为一款经典的编程题库,吸引了众多程序员前来挑战。其中,LeetCode 2 题:非负整数相加是一个备受关注的难题。这道题不仅考察了程序员对算法和数据结构的理解,也考验了他们的编程能力。本文将为您详细解析这道题,提供一种巧妙的解法,帮助您轻松应对。
题目
LeetCode 2 题的题目如下:
给定两个非空链表,分别代表两个非负整数,它们的高低位顺序和链表顺序相反,链表中,每个节点代表一位数,要求将两个链表相加,结果也以链表形式返回。
假设链表都不会以 0 开头,除了 0 本身外。
解题思路
这道题乍一看似乎很复杂,但实际上却比较简单。关键在于理解链表的顺序和数字的高低位顺序相反这一特性。也就是说,当我们从链表的头部开始遍历时,实际上是从数字的末位开始读取。因此,我们可以将两个链表从头部开始相加,并将进位存储起来。当我们到达两个链表的尾部时,如果还有进位,则需要创建一个新的节点来存储这个进位。
代码实现
def addTwoNumbers(l1, l2):
"""
:type l1: ListNode
:type l2: ListNode
:rtype: ListNode
"""
# 定义一个虚拟头结点,方便后续操作
dummy = ListNode(0)
# 定义一个进位变量
carry = 0
# 定义当前节点变量
curr = dummy
# 循环遍历两个链表
while l1 or l2 or carry:
# 获取两个链表当前节点的值,如果不存在则赋予 0
v1 = l1.val if l1 else 0
v2 = l2.val if l2 else 0
# 计算两个节点的和与进位
total = v1 + v2 + carry
carry = total // 10
curr.next = ListNode(total % 10)
# 移动当前节点
curr = curr.next
# 移动两个链表的当前节点
l1 = l1.next if l1 else None
l2 = l2.next if l2 else None
# 返回虚拟头结点的下一个节点,即结果链表
return dummy.next
复杂度分析
- 时间复杂度:O(max(m, n)),其中 m 和 n 分别是两个链表的长度。因为我们只需要遍历两个链表一次,因此时间复杂度为 O(max(m, n))。
- 空间复杂度:O(max(m, n)),因为我们最多需要创建一个长度为 max(m, n) 的结果链表。
结语
LeetCode 2 题是一道经典的难题,考察了程序员对算法和数据结构的理解,以及他们的编程能力。本文详细解析了这道题,提供了一种巧妙的解法,帮助您轻松应对。希望您能通过本文对算法和数据结构有更深入的理解,并在 LeetCode 上取得更好的成绩。