题目描述
用一个 非空 单链表来表示一个非负整数,然后将这个整数加一。
你可以假设这个整数除了 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;
};