数学
链表
题目描述
给定一个用链表 表示的非负整数, 然后将这个整数 再加上 1 。
这些数字的存储是这样的:最高位有效的数字位于链表的首位 head
。
示例 1:
输入: head = [1,2,3]
输出: [1,2,4]
示例 2:
输入: head = [0]
输出: [1]
提示:
链表中的节点数在 [1, 100]
的范围内。
0 <= Node.val <= 9
由链表表示的数字不包含前导零,除了零本身。
解法
方法一:链表遍历
我们先设置一个虚拟头节点 \(\textit{dummy}\) ,初始时 \(\textit{dummy}\) 的值为 \(0\) ,并且 \(\textit{dummy}\) 的后继节点为链表 \(\textit{head}\) 。
接下来,我们从虚拟头节点开始遍历链表,找到最后一个不为 \(9\) 的节点,将其值加 \(1\) ,并将该节点之后的所有节点的值置为 \(0\) 。
最后,我们判断虚拟头节点的值是否为 \(1\) ,如果为 \(1\) ,则返回 \(\textit{dummy}\) ,否则返回 \(\textit{dummy}\) 的后继节点。
时间复杂度 \(O(n)\) ,其中 \(n\) 是链表的长度。空间复杂度 \(O(1)\) 。
Python3 Java C++ Go TypeScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 # Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution :
def plusOne ( self , head : Optional [ ListNode ]) -> Optional [ ListNode ]:
dummy = ListNode ( 0 , head )
target = dummy
while head :
if head . val != 9 :
target = head
head = head . next
target . val += 1
target = target . next
while target :
target . val = 0
target = target . next
return dummy if dummy . val else dummy . next
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 /**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode plusOne ( ListNode head ) {
ListNode dummy = new ListNode ( 0 , head );
ListNode target = dummy ;
while ( head != null ) {
if ( head . val != 9 ) {
target = head ;
}
head = head . next ;
}
++ target . val ;
target = target . next ;
while ( target != null ) {
target . val = 0 ;
target = target . next ;
}
return dummy . val == 1 ? dummy : dummy . next ;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 /**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public :
ListNode * plusOne ( ListNode * head ) {
ListNode * dummy = new ListNode ( 0 , head );
ListNode * target = dummy ;
for (; head ; head = head -> next ) {
if ( head -> val != 9 ) {
target = head ;
}
}
target -> val ++ ;
for ( target = target -> next ; target ; target = target -> next ) {
target -> val = 0 ;
}
return dummy -> val ? dummy : dummy -> next ;
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 /**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func plusOne ( head * ListNode ) * ListNode {
dummy := & ListNode { 0 , head }
target := dummy
for head != nil {
if head . Val != 9 {
target = head
}
head = head . Next
}
target . Val ++
for target = target . Next ; target != nil ; target = target . Next {
target . Val = 0
}
if dummy . Val == 1 {
return dummy
}
return dummy . Next
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 /**
* Definition for singly-linked list.
* class ListNode {
* val: number
* next: ListNode | null
* constructor(val?: number, next?: ListNode | null) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
* }
*/
function plusOne ( head : ListNode | null ) : ListNode | null {
const dummy = new ListNode ( 0 , head );
let target = dummy ;
while ( head ) {
if ( head . val !== 9 ) {
target = head ;
}
head = head . next ;
}
target . val ++ ;
for ( target = target . next ; target ; target = target . next ) {
target . val = 0 ;
}
return dummy . val ? dummy : dummy.next ;
}