【中等】力扣算法题解析LeetCode369:给单链表加一

关注文末推广名片,即可免费获得本题测试源码

题目来源:🔒LeetCode 369. 给单链表加一

问题抽象: 给定一个非空 单向链表(头节点 head),表示一个 非负整数(头节点为最高位,尾节点为个位),要求实现链表的 加一操作,并返回新链表的头节点,满足以下核心需求:

  1. 操作规则定义

    • 从链表尾部(个位)开始执行 加一,逐位处理 进位(当前位 = (val + carry) % 10,进位 = (val + carry) // 10);
    • 若最高位产生新进位(carry=1),需在链表头部插入值为 1 的新节点。
  2. 数据结构要求

    • 链表节点结构:class ListNode { int val; ListNode next; }
    • 禁止直接修改节点值(需处理进位和节点新增);
    • 结果链表需保持原节点顺序(最高位→最低位)。
  3. 计算约束

    • 时间复杂度 O(n)n 为链表长度),空间复杂度 O(1)(需避免递归栈);
    • 需通过 链表反转双指针 实现:
      • 反转链表 → 从新头部(原尾部)开始加一 → 处理进位 → 反转恢复;
      • 或定位 最后一个非9节点(避免全为9时遍历两次)。
  4. 边界处理

    • 链表表示 0(单节点 0)→ 加一后为 1(仍为单节点);
    • 9 链表(如 9→9→9)→ 加一后为 1→0→0→0(新增头节点);
    • 部分进位:
      • 1→2→31→2→4(无进位);
      • 1→2→91→3→0(十位进位);
      • 9→91→0→0(新增头节点)。

输入:单向链表头节点 head(节点数 ≥1,节点值 0-9)。
输出:加一后链表的头节点。


解题思路

题目要求用一个非空单链表表示一个非负整数,然后对这个整数加一,并用同样的链表形式返回结果。链表的每个节点存储一个数字,头节点表示最高位。由于加一操作是从最低位开始,而链表只能从头到尾遍历,因此需要考虑如何高效地处理进位问题。关键思路如下:

  1. 哑节点处理进位:创建一个值为0的哑节点指向头节点,以处理头节点进位的情况(例如999+1=1000)。
  2. 定位最后一个非9节点:遍历链表,记录最后一个值不为9的节点。该节点加一后不会产生进位。
  3. 加一与置零操作
    • 将最后一个非9节点的值加一。
    • 将该节点之后的所有节点(值均为9)置为0。
  4. 返回结果:如果哑节点值变为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;
    }
}

代码说明

  1. 哑节点初始化dummy节点值为0,指向头节点,用于统一处理头节点进位。
  2. 定位最后一个非9节点
    • lastNotNine初始指向哑节点。
    • 遍历链表,遇到非9节点时更新lastNotNine
  3. 加一与置零
    • lastNotNine.val += 1:最后一个非9节点加一。
    • 后续节点全为9,需置零(如1999+1→2000)。
  4. 结果返回
    • dummy.val变为1(原链表全为9),返回dummy
    • 否则返回dummy.next(原头节点)。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

达文汐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值