Skip to content

Commit 9f8b400

Browse files
committed
solution for Reverse Nodes in k-Group, O(N) runtime and memory, O(N) runtime and O(1) memory
1 parent 50d2519 commit 9f8b400

File tree

2 files changed

+117
-0
lines changed

2 files changed

+117
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
// https://leetcode.com/problems/reverse-nodes-in-k-group/
2+
package main
3+
4+
/**
5+
* Definition for singly-linked list.
6+
* type ListNode struct {
7+
* Val int
8+
* Next *ListNode
9+
* }
10+
*/
11+
12+
func reverseKGroup(head *ListNode, k int) *ListNode {
13+
14+
first := head
15+
var reversed, reversedLast *ListNode
16+
17+
for first != nil {
18+
19+
// [1,2,3,4,5], k=2; i=0..2 (0,1,2) last = &1, 0(last=&1), 1(last=&2), 2(last=&3),
20+
last := first
21+
for i := 0; i < k-1; i++ {
22+
last = last.Next
23+
if last == nil {
24+
if reversed == nil {
25+
reversed = first
26+
} else {
27+
reversedLast.Next = first
28+
}
29+
return reversed
30+
}
31+
}
32+
33+
// [1,2,3,4,5], [2,1], reversed = lst [2,1], reversedLast = lstLast [2, 1, ]
34+
lst, lstLast := reverse(first, k) // returns reversed copy
35+
36+
if reversed == nil {
37+
reversed = lst
38+
reversedLast = lstLast
39+
} else {
40+
reversedLast.Next = lst
41+
reversedLast = lstLast
42+
}
43+
44+
first = last.Next // first = &3
45+
}
46+
return reversed
47+
}
48+
49+
// reverse: [1, 2, 3, 4, 5], reversed = nil, current = &1, prev = &1
50+
func reverse(root *ListNode, k int) (reversed, reversedLast *ListNode) {
51+
current := root
52+
prev := reversed
53+
54+
for idx := 0; idx < k; idx++ {
55+
elem := &ListNode{current.Val, nil}
56+
elem.Next = prev // 1
57+
reversed = elem // 2
58+
prev = elem // 3
59+
current = current.Next // 4
60+
if idx == 0 {
61+
reversedLast = elem
62+
}
63+
}
64+
65+
return reversed, reversedLast
66+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
// https://leetcode.com/problems/reverse-nodes-in-k-group/
2+
package main
3+
4+
/**
5+
* Definition for singly-linked list.
6+
* type ListNode struct {
7+
* Val int
8+
* Next *ListNode
9+
* }
10+
*/
11+
12+
func reverseKGroup(head *ListNode, k int) *ListNode {
13+
curr := head
14+
firstReverse := true
15+
var prev *ListNode = nil
16+
for curr != nil {
17+
last := curr // iter2: last = &3
18+
for i := 0; i < k-1; i++ {
19+
last = last.Next
20+
if last == nil {
21+
return head
22+
}
23+
}
24+
nextCurr := last.Next
25+
26+
reverseInPlace(curr, k)
27+
if prev != nil {
28+
prev.Next = last
29+
}
30+
31+
if firstReverse {
32+
head = last
33+
firstReverse = false
34+
}
35+
prev = curr
36+
curr = nextCurr
37+
}
38+
return head
39+
}
40+
41+
func reverseInPlace(root *ListNode, k int) {
42+
curr := root
43+
next := curr.Next
44+
for i := 0; i < k-1; i++ {
45+
tmp := next.Next
46+
next.Next = curr
47+
curr = next
48+
next = tmp
49+
}
50+
root.Next = next
51+
}

0 commit comments

Comments
 (0)