LeetCode 369. 给单链表加一|刷题打卡

990 阅读1分钟

题目描述

用一个 非空 单链表来表示一个非负整数,然后将这个整数加一。

你可以假设这个整数除了 0 本身,没有任何前导的 0。

这个整数的各个数位按照 高位在链表头部、低位在链表尾部 的顺序排列。

示例:

输入: [1,2,3]
输出: [1,2,4]

解题思路

官方题解

方法一:哨兵头节点

  • 整体思路:
  • 加法运算
    • 找出最靠右的不是 9 的数字,将该数字加 1。然后将该数字之后所有的 9 改成 0

算法

  • 初始化哨兵节点 ListNode(0),同时将它设为新的头节点:sentinel.next = head
  • 找到最靠右的数值不为 9 的节点。
  • 将该节点的数值加 1
  • 将该节点之后所有节点数值改为 0
  • 如果哨兵节点的数值为 1,直接返回哨兵节点,否则返回原始头节点 sentinel.next

代码

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var plusOne = function (head) {
  // 1. 建立哨兵节点
  let sentinel = new ListNode(0);
  sentinel.next = head;
  let cur = sentinel;
  // 2. 找到最右边值不为9的节点
  while (head !== null) {
    if (head.val !== 9) cur = head;
    head = head.next;
  }
  // 3. 该节点 值加1
  cur.val++;
  cur = cur.next;
  // 4. 该节点后面的值全部变成 0
  while (cur !== null) {
    cur.val = 0;
    cur = cur.next;
  }
  // 5. 如果 哨兵的值为1,就返回哨兵,否则返回 next
  return sentinel.val === 1 ? sentinel : sentinel.next;
};