1. 题目背景与核心需求
这道题目来自LeetCode热题100中的第2题"两数相加",属于链表操作类的基础算法题。题目要求我们处理两个非空链表,它们各自代表一个非负整数,其中每个节点存储一位数字且按逆序排列。我们需要将这两个数相加,并以相同形式的链表返回结果。
在实际工程中,这种链表操作模拟数字运算的场景并不少见。比如处理超大整数运算时(超过语言原生整数类型范围),就需要用类似的数据结构来存储和计算。这也是为什么这道题被列为面试高频题的原因之一——它考察了开发者对链表操作的熟练度,以及对数学运算过程的理解能力。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 问题分析与解题思路
2.1 输入输出示例解析
假设我们有两个链表:
- 链表1:2 -> 4 -> 3 (表示数字342)
- 链表2:5 -> 6 -> 4 (表示数字465)
按照题目要求,我们需要计算342 + 465 = 807,然后返回链表:7 -> 0 -> 8
这里有几个关键点需要注意:
- 数字是逆序存储的,个位数在链表头部
- 需要考虑进位的情况
- 两个链表长度可能不一致
- 最后可能有额外的进位(比如5+5=10,需要新增一个节点)
2.2 算法选择与时间复杂度分析
这道题最直接的解法是模拟手工加法过程:
- 同时遍历两个链表,逐位相加
- 处理进位(当前位的和≥10时)
- 处理链表长度不等的情况
- 处理最后的进位
时间复杂度是O(max(m,n)),其中m和n分别是两个链表的长度。空间复杂度也是O(max(m,n)),主要是存储结果链表。
3. 代码实现与逐行解析
3.1 Python实现版本
python复制class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
def addTwoNumbers(l1: ListNode, l2: ListNode) -> ListNode:
dummy = ListNode() # 虚拟头节点,简化操作
current = dummy
carry = 0 # 进位
while l1 or l2 o
