高位进位是大数加法的自然延续,需在每轮计算中复用carry并最终单独检查;逆序链表遍历完若carry为1,须新建节点补最高位;虚拟头节点可统一处理所有节点及进位收尾。

链表实现大数加法时,高位进位不是“额外情况”,而是计算流程的自然延续。关键在于:进位必须参与每一轮计算,并在所有节点处理完毕后单独检查一次。
为什么进位可能出现在最高位之后
两个 n 位数相加,结果最多是 n+1 位(例如 999 + 1 = 1000)。链表按逆序存储(个位在头),遍历结束时若 carry == 1,说明产生了新的最高位,必须新建节点补上。
常见误区是只在循环内处理进位,忽略循环外的 final carry。比如 [5] + [5] → sum=10,个位得 0,carry=1;此时 l1 和 l2 都已为空,但 carry 仍为 1,必须追加节点 1。
carry 的更新与复用逻辑
每轮计算中,carry 是“上一轮留下的”,参与本轮求和;本轮求和结果又决定“下一轮的 carry”。这个链条不能断裂:
- 初始化 carry = 0(个位无前置进位)
- 当前位总和 = val1 + val2 + carry
- 新节点值 = sum % 10(取个位)
- 下轮 carry = sum / 10(取进位,整除,结果只能是 0 或 1)
双链表不等长时的进位连续性保障
当一个链表提前结束(如 l1 走完,l2 还剩三位),后续轮次中 val1 恒为 0,但 carry 仍持续传递:
例:l1 = [9,9], l2 = [1,0,0,0](即 99 + 1000 = 1099,逆序为 [9,9,0,1])
- 第1轮:9 + 1 + 0 = 10 → 节点 0,carry = 1
- 第2轮:9 + 0 + 1 = 10 → 节点 0,carry = 1
- 第3轮:0 + 0 + 1 = 1 → 节点 1,carry = 0
- 第4轮:0 + 0 + 0 = 0 → 节点 0,carry = 0
可见,即使 l1 已空,carry 仍驱动 l2 剩余位完成带进位计算,最终得到 [0,0,1,0] → 正确逆序结果。
虚拟头节点如何简化进位收尾
不用判断 head 是否为空,就能统一处理所有节点(含最后进位节点):
- 创建 dummy = new ListNode(0),curr = dummy
- 每轮 curr.next = new ListNode(sum % 10),curr = curr.next
- 循环结束后,若 carry == 1,则 curr.next = new ListNode(1)
- 返回 dummy.next(跳过占位头)
这样避免了对首个节点的特殊分支判断,也确保 carry 节点能自然挂到链尾,逻辑清晰不易漏。










