1. 问题背景与核心需求
两数相加是算法学习中最基础的题型之一,但恰恰是这种看似简单的问题,最能考验编程基本功和边界条件处理能力。在实际工程中,类似链表操作、大数运算等场景都会用到这个算法的变种。
这道题的经典描述是:给定两个非空链表,表示两个非负整数。每位数字按照逆序存储(即个位在链表头部),每个节点存储一位数字。要求将这两个数相加,并以相同形式返回结果链表。
注意:题目假设数字不以0开头(除了数字0本身),且需要考虑进位情况。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 算法设计思路拆解
2.1 链表结构分析
首先我们需要理解链表节点的典型定义:
python复制class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
每个节点包含:
- val:当前位的数字(0-9)
- next:指向下一个节点的指针
例如数字342会表示为2->4->3的链表结构
2.2 核心算法流程
-
初始化:
- 创建哑节点(dummy)作为结果链表的头部
- 初始化进位carry为0
- 当前指针cur指向dummy
-
遍历处理:
- 同时遍历两个链表,直到都到达末尾
- 每次取出当前节点的值(若节点不存在则取0)
- 计算当前位的和:sum = val1 + val2 + carry
- 确定当前位的值:sum % 10
- 更新进位:carry = sum // 10
- 创建新节点并移动指针
-
最后检查:
- 遍历结束后若carry>0,需要额外添加一个节点
2.3 边界条件处理
需要特别注意以下几种情况:
- 两个链表长度不等(如123+45)
- 最高位产生进位(如99+1=100)
- 其中一个链表为空的情况
- 两个链表都为空的情况
3. 完整代码实现与解析
3.1 Python实现
python复制def addTwoNumbers(l1: ListNode, l2: ListNode) -> ListNode:
dummy = ListNode()
cur = dummy
