-
Notifications
You must be signed in to change notification settings - Fork 0
/
23-merge-k-sorted-lists.go
97 lines (88 loc) · 1.96 KB
/
23-merge-k-sorted-lists.go
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
type minHeap struct{
data []*ListNode
size int
}
func (h *minHeap) Parent(i int) int{
return (i-1)/2
}
func (h *minHeap) Left(i int) int{
return 2*i + 1
}
func (h *minHeap) Right(i int) int{
return 2*i + 2
}
func (h *minHeap) Push(l *ListNode) {
if len(h.data) == 0 {
h.data = append(h.data, l)
return
}
h.data = append(h.data, l)
i := len(h.data) -1
for i > 0 && h.data[i].Val < h.data[h.Parent(i)].Val {
h.data[i], h.data[h.Parent(i)] = h.data[h.Parent(i)], h.data[i]
i = h.Parent(i)
}
}
func (h *minHeap) Pop() *ListNode {
root := h.data[0]
h.data[0], h.data[len(h.data)-1] = h.data[len(h.data)-1], h.data[0]
h.data = h.data[:len(h.data)-1]
h.Heapify(0)
return root
}
func(h *minHeap) Heapify(i int) {
smallest := i
l:=h.Left(i)
r:=h.Right(i)
n := len(h.data)
if l < n && h.data[l].Val < h.data[smallest].Val {
smallest = l
}
if r < n && h.data[r].Val < h.data[smallest].Val {
smallest = r
}
if smallest !=i {
h.data[i], h.data[smallest] = h.data[smallest], h.data[i]
h.Heapify(smallest)
}
}
func (h *minHeap) Print() {
fmt.Println("Printing")
fmt.Println(h.data)
for _,l := range h.data {
fmt.Printf(" => %d ", l.Val)
}
fmt.Println("")
}
func mergeKLists(lists []*ListNode) *ListNode {
h := new(minHeap)
h.size = len(h.data)
for _, l := range lists {
if l != nil {
h.Push(l)
}
}
var ret *ListNode
var prev *ListNode
for len(h.data) > 0 {
d := h.Pop()
if prev == nil {
prev = d
ret = d
} else {
prev.Next = d
prev = d
}
if d.Next != nil {
h.Push(d.Next)
}
}
return ret
}