链表
数学
题目描述
给定一个用链表 表示的非负整数, 然后将这个整数 再加上 1 。
这些数字的存储是这样的:最高位有效的数字位于链表的首位 head
。
示例 1:
输入: head = [1,2,3]
输出: [1,2,4]
示例 2:
输入: head = [0]
输出: [1]
提示:
链表中的节点数在 [1, 100]
的范围内。
0 <= Node.val <= 9
由链表表示的数字不包含前导零,除了零本身。
解法
方法一:链表遍历
我们先设置一个虚拟头节点 dummy
,初始值为 $0$,指向链表头节点 head
。
然后从链表头节点开始遍历,找出链表最后一个值不等于 $9$ 的节点 target
,将 target
的值加 $1$。接着将 target
之后的所有节点值置为 $0$。
需要注意的是,如果链表中所有节点值都为 $9$,那么遍历结束后,target
会指向空节点,这时我们需要将 dummy
的值加 $1$,然后返回 dummy
,否则返回 dummy
的下一个节点。
时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为链表的长度。
Python3 Java C++ Go
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 : ListNode ) -> 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
28 /**
* 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 ;
while ( head ) {
if ( head -> val != 9 ) target = head ;
head = head -> next ;
}
++ target -> val ;
target = target -> next ;
while ( target ) {
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.
* 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 ++
target = target . Next
for target != nil {
target . Val = 0
target = target . Next
}
if dummy . Val == 1 {
return dummy
}
return dummy . Next
}
GitHub