【LeetCode - 369】给单链表加一

1、题目描述

在这里插入图片描述

2、解题思路

  本题需要特别注意的地方在于进位。

如果最后一个节点的值为 9 ,则最后一个节点变为 0,上一个节点加 1;

我们定义一个新的头结点 newHead,它的 next 为输入的 head;即:数字 123 变成数字 0123,不改变数字的大小。

现在不清楚链表的末尾到底连着有多少个 9,于是我们定义一个 attention 指向末尾为连续9情况下的右到左第一个非9的数字;
在这里插入图片描述

  初始时:attention 指向 newHead,我们初始假设输入的数字全是 9;

  接着定义一个指针节点 index ,初始时指向 newHead;

  index 往下遍历:

  1、如果 index.val != 9 并且 index.next.val == 9,说明有可能会进位,更新 attention = index;

  2、当遍历到末尾时,判断此时 index.val 是否为 9:

  2.1 index.val != 9,则直接末尾元素加一,返回头结点即可;

  2.2 index.val == 9,说明需要进位,把从 attention 的下一个结点开始,到最末端元素,全置零,然后把 attention 的值加一;如果 newHead 的值为 0 ,说明进位没有影响到这里,返回 head;如果 newHead == 1,说明原来输入的数字全是 9,返回 newHead。

3、解题代码

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode plusOne(ListNode head) {
        if (head == null) return head;
        ListNode newHead = new ListNode(0);
        newHead.next = head;
        ListNode attention = newHead;   // 它的下一个节点值为 9,万一需要进位
        ListNode index = head;
        while (index.next != null) {
            if (index.val != 9 && index.next.val == 9) {
                attention = index;  // 下一个为 9,做好进位的准备
            }
            index = index.next;
        }
        if (index.val == 9) {
            ListNode tmp = attention.next;
            while (tmp != null) {   // attention后面全变为 0 
                tmp.val = 0;
                tmp = tmp.next;
            }
            attention.val = attention.val + 1;
        } else {
            index.val = index.val + 1;
        }
        return newHead.val == 0 ? newHead.next : newHead;
    }
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值