Skip to content

Commit a629981

Browse files
committed
+ problem 25
1 parent 6d1bae3 commit a629981

File tree

5 files changed

+171
-0
lines changed

5 files changed

+171
-0
lines changed
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
# 25. Reverse Nodes in k-Group
2+
Given the `head` of a linked list, reverse the nodes of the list `k` at a time, and return *the modified list*.
3+
4+
`k` is a positive integer and is less than or equal to the length of the linked list. If the number of nodes is not a multiple of `k` then left-out nodes, in the end, should remain as it is.
5+
6+
You may not alter the values in the list's nodes, only nodes themselves may be changed.
7+
8+
#### Example 1:
9+
![](https://assets.leetcode.com/uploads/2020/10/03/reverse_ex1.jpg)
10+
<pre>
11+
<strong>Input:</strong> head = [1,2,3,4,5], k = 2
12+
<strong>Output:</strong> [2,1,4,3,5]
13+
</pre>
14+
15+
#### Example 2:
16+
![](https://assets.leetcode.com/uploads/2020/10/03/reverse_ex2.jpg)
17+
<pre>
18+
<strong>Input:</strong> head = [1,2,3,4,5], k = 3
19+
<strong>Output:</strong> [3,2,1,4,5]
20+
</pre>
21+
22+
#### Constraints:
23+
* The number of nodes in the list is `n`.
24+
* `1 <= k <= n <= 5000`
25+
* `0 <= Node.val <= 1000`
26+
27+
**Follow-up:** Can you solve the problem in `O(1)` extra memory space?
28+
29+
## Solutions (Python)
30+
31+
### 1. Solution
32+
```Python
33+
# Definition for singly-linked list.
34+
# class ListNode:
35+
# def __init__(self, val=0, next=None):
36+
# self.val = val
37+
# self.next = next
38+
class Solution:
39+
def reverseKGroup(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:
40+
length = 0
41+
curr = head
42+
while curr is not None:
43+
length += 1
44+
curr = curr.next
45+
46+
dummy = ListNode(next=head)
47+
grouptail = dummy
48+
49+
for _ in range(length // k):
50+
grouphead = grouptail.next
51+
prev = grouphead
52+
for _ in range(k):
53+
prev = prev.next
54+
55+
curr = grouphead
56+
for _ in range(k):
57+
temp = curr
58+
curr = curr.next
59+
temp.next = prev
60+
prev = temp
61+
62+
grouptail.next = prev
63+
grouptail = grouphead
64+
65+
return dummy.next
66+
```
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
# 25. K 个一组翻转链表
2+
给你链表的头节点 `head` ,每 `k` 个节点一组进行翻转,请你返回修改后的链表。
3+
4+
`k` 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 `k` 的整数倍,那么请将最后剩余的节点保持原有顺序。
5+
6+
你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
7+
8+
#### 示例 1:
9+
![](https://assets.leetcode.com/uploads/2020/10/03/reverse_ex1.jpg)
10+
<pre>
11+
<strong>输入:</strong> head = [1,2,3,4,5], k = 2
12+
<strong>输出:</strong> [2,1,4,3,5]
13+
</pre>
14+
15+
#### 示例 2:
16+
![](https://assets.leetcode.com/uploads/2020/10/03/reverse_ex2.jpg)
17+
<pre>
18+
<strong>输入:</strong> head = [1,2,3,4,5], k = 3
19+
<strong>输出:</strong> [3,2,1,4,5]
20+
</pre>
21+
22+
#### 提示:
23+
* 链表中的节点数目为 `n`
24+
* `1 <= k <= n <= 5000`
25+
* `0 <= Node.val <= 1000`
26+
27+
**进阶:**你可以设计一个只用 `O(1)` 额外内存空间的算法解决此问题吗?
28+
29+
## 题解 (Python)
30+
31+
### 1. 题解
32+
```Python
33+
# Definition for singly-linked list.
34+
# class ListNode:
35+
# def __init__(self, val=0, next=None):
36+
# self.val = val
37+
# self.next = next
38+
class Solution:
39+
def reverseKGroup(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:
40+
length = 0
41+
curr = head
42+
while curr is not None:
43+
length += 1
44+
curr = curr.next
45+
46+
dummy = ListNode(next=head)
47+
grouptail = dummy
48+
49+
for _ in range(length // k):
50+
grouphead = grouptail.next
51+
prev = grouphead
52+
for _ in range(k):
53+
prev = prev.next
54+
55+
curr = grouphead
56+
for _ in range(k):
57+
temp = curr
58+
curr = curr.next
59+
temp.next = prev
60+
prev = temp
61+
62+
grouptail.next = prev
63+
grouptail = grouphead
64+
65+
return dummy.next
66+
```
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# Definition for singly-linked list.
2+
# class ListNode:
3+
# def __init__(self, val=0, next=None):
4+
# self.val = val
5+
# self.next = next
6+
class Solution:
7+
def reverseKGroup(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:
8+
length = 0
9+
curr = head
10+
while curr is not None:
11+
length += 1
12+
curr = curr.next
13+
14+
dummy = ListNode(next=head)
15+
grouptail = dummy
16+
17+
for _ in range(length // k):
18+
grouphead = grouptail.next
19+
prev = grouphead
20+
for _ in range(k):
21+
prev = prev.next
22+
23+
curr = grouphead
24+
for _ in range(k):
25+
temp = curr
26+
curr = curr.next
27+
temp.next = prev
28+
prev = temp
29+
30+
grouptail.next = prev
31+
grouptail = grouphead
32+
33+
return dummy.next

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
[21][21l] |[Merge Two Sorted Lists][21] |![py]
2626
[22][22l] |[Generate Parentheses][22] |![rs]
2727
[24][24l] |[Swap Nodes in Pairs][24] |![py]
28+
[25][25l] |[Reverse Nodes in k-Group][25] |![py]
2829
[26][26l] |[Remove Duplicates from Sorted Array][26] |![rs]
2930
[27][27l] |[Remove Element][27] |![rb]&nbsp;&nbsp;![rs]
3031
[28][28l] |[Implement strStr()][28] |![py]
@@ -1561,6 +1562,7 @@
15611562
[21]:Problemset/0021-Merge%20Two%20Sorted%20Lists/README.md#21-merge-two-sorted-lists
15621563
[22]:Problemset/0022-Generate%20Parentheses/README.md#22-generate-parentheses
15631564
[24]:Problemset/0024-Swap%20Nodes%20in%20Pairs/README.md#24-swap-nodes-in-pairs
1565+
[25]:Problemset/0025-Reverse%20Nodes%20in%20k-Group/README.md#25-reverse-nodes-in-k-group
15641566
[26]:Problemset/0026-Remove%20Duplicates%20from%20Sorted%20Array/README.md#26-remove-duplicates-from-sorted-array
15651567
[27]:Problemset/0027-Remove%20Element/README.md#27-remove-element
15661568
[28]:Problemset/0028-Implement%20strStr\(\)/README.md#28-implement-strstr
@@ -3089,6 +3091,7 @@
30893091
[21l]:https://leetcode.com/problems/merge-two-sorted-lists/
30903092
[22l]:https://leetcode.com/problems/generate-parentheses/
30913093
[24l]:https://leetcode.com/problems/swap-nodes-in-pairs/
3094+
[25l]:https://leetcode.com/problems/reverse-nodes-in-k-group/
30923095
[26l]:https://leetcode.com/problems/remove-duplicates-from-sorted-array/
30933096
[27l]:https://leetcode.com/problems/remove-element/
30943097
[28l]:https://leetcode.com/problems/implement-strstr/

README_CN.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
[21][21l] |[合并两个有序链表][21] |![py]
2626
[22][22l] |[括号生成][22] |![rs]
2727
[24][24l] |[两两交换链表中的节点][24] |![py]
28+
[25][25l] |[K 个一组翻转链表][25] |![py]
2829
[26][26l] |[删除排序数组中的重复项][26] |![rs]
2930
[27][27l] |[移除元素][27] |![rb]&nbsp;&nbsp;![rs]
3031
[28][28l] |[实现 strStr()][28] |![py]
@@ -1561,6 +1562,7 @@
15611562
[21]:Problemset/0021-Merge%20Two%20Sorted%20Lists/README_CN.md#21-合并两个有序链表
15621563
[22]:Problemset/0022-Generate%20Parentheses/README_CN.md#22-括号生成
15631564
[24]:Problemset/0024-Swap%20Nodes%20in%20Pairs/README_CN.md#24-两两交换链表中的节点
1565+
[25]:Problemset/0025-Reverse%20Nodes%20in%20k-Group/README_CN.md#25-k-个一组翻转链表
15641566
[26]:Problemset/0026-Remove%20Duplicates%20from%20Sorted%20Array/README_CN.md#26-删除排序数组中的重复项
15651567
[27]:Problemset/0027-Remove%20Element/README_CN.md#27-移除元素
15661568
[28]:Problemset/0028-Implement%20strStr\(\)/README_CN.md#28-实现-strstr
@@ -3089,6 +3091,7 @@
30893091
[21l]:https://leetcode.cn/problems/merge-two-sorted-lists/
30903092
[22l]:https://leetcode.cn/problems/generate-parentheses/
30913093
[24l]:https://leetcode.cn/problems/swap-nodes-in-pairs/
3094+
[25l]:https://leetcode.cn/problems/reverse-nodes-in-k-group/
30923095
[26l]:https://leetcode.cn/problems/remove-duplicates-from-sorted-array/
30933096
[27l]:https://leetcode.cn/problems/remove-element/
30943097
[28l]:https://leetcode.cn/problems/implement-strstr/

0 commit comments

Comments
 (0)