题目来源:🔒LeetCode 369. 给单链表加一
问题抽象: 给定一个非空 单向链表(头节点 head),表示一个 非负整数(头节点为最高位,尾节点为个位),要求实现链表的 加一操作,并返回新链表的头节点,满足以下核心需求:
-
操作规则定义:
- 从链表尾部(个位)开始执行 加一,逐位处理 进位(当前位
= (val + carry) % 10,进位= (val + carry) // 10); - 若最高位产生新进位(
carry=1),需在链表头部插入值为1的新节点。
- 从链表尾部(个位)开始执行 加一,逐位处理 进位(当前位
-
数据结构要求:
- 链表节点结构:
class ListNode { int val; ListNode next; }; - 禁止直接修改节点值(需处理进位和节点新增);
- 结果链表需保持原节点顺序(最高位→最低位)。
- 链表节点结构:
-
计算约束:
- 时间复杂度 O(n)(
n为链表长度),空间复杂度 O(1)(需避免递归栈); - 需通过 链表反转 或 双指针 实现:
- 反转链表 → 从新头部(原尾部)开始加一 → 处理进位 → 反转恢复;
- 或定位 最后一个非9节点(避免全为9时遍历两次)。
- 时间复杂度 O(n)(
-
边界处理:
- 链表表示
0(单节点0)→ 加一后为1(仍为单节点); - 全
9链表(如9→9→9)→ 加一后为1→0→0→0(新增头节点); - 部分进位:
1→2→3→1→2→4(无进位);1→2→9→1→3→0(十位进位);9→9→1→0→0(新增头节点)。
- 链表表示
输入:单向链表头节点 head(节点数 ≥1,节点值 0-9)。
输出:加一后链表的头节点。
解题思路
题目要求用一个非空单链表表示一个非负整数,然后对这个整数加一,并用同样的链表形式返回结果。链表的每个节点存储一个数字,头节点表示最高位。由于加一操作是从最低位开始,而链表只能从头到尾遍历,因此需要考虑如何高效地处理进位问题。关键思路如下:
- 哑节点处理进位:创建一个值为0的哑节点指向头节点,以处理头节点进位的情况(例如999+1=1000)。
- 定位最后一个非9节点:遍历链表,记录最后一个值不为9的节点。该节点加一后不会产生进位。
- 加一与置零操作:
- 将最后一个非9节点的值加一。
- 将该节点之后的所有节点(值均为9)置为0。
- 返回结果:如果哑节点值变为1,说明最高位发生进位,返回哑节点;否则返回原头节点。
此方法只需一次遍历定位最后一个非9节点,再一次遍历置零后续节点,时间复杂度为O(n),空间复杂度为O(1)。
代码实现(Java版)🔥点击下载源码
class Solution {
public ListNode plusOne(ListNode head) {
// 创建哑节点,指向头节点,用于处理头节点进位
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode lastNotNine = dummy; // 记录最后一个非9节点
ListNode cur = head;
// 遍历链表,定位最后一个非9节点
while (cur != null) {
if (cur.val != 9) {
lastNotNine = cur;
}
cur = cur.next;
}
// 最后一个非9节点加1
lastNotNine.val += 1;
// 将该节点后所有节点置0
cur = lastNotNine.next;
while (cur != null) {
cur.val = 0;
cur = cur.next;
}
// 若哑节点值为1,说明有进位,返回哑节点;否则返回原头节点
return dummy.val == 1 ? dummy : dummy.next;
}
}
代码说明
- 哑节点初始化:
dummy节点值为0,指向头节点,用于统一处理头节点进位。 - 定位最后一个非9节点:
lastNotNine初始指向哑节点。- 遍历链表,遇到非9节点时更新
lastNotNine。
- 加一与置零:
lastNotNine.val += 1:最后一个非9节点加一。- 后续节点全为9,需置零(如1999+1→2000)。
- 结果返回:
- 若
dummy.val变为1(原链表全为9),返回dummy。 - 否则返回
dummy.next(原头节点)。
- 若

1366

被折叠的 条评论
为什么被折叠?



