feaf
This commit is contained in:
63
pkg/merge_k_sorted_lists/main.go
Normal file
63
pkg/merge_k_sorted_lists/main.go
Normal file
@@ -0,0 +1,63 @@
|
||||
package mergeksortedlists
|
||||
|
||||
import "container/heap"
|
||||
|
||||
type ListNode struct {
|
||||
Val int
|
||||
Next *ListNode
|
||||
}
|
||||
|
||||
type ListNodeHeap []*ListNode
|
||||
|
||||
func (l ListNodeHeap) Len() int {
|
||||
return len(l)
|
||||
}
|
||||
|
||||
func (l ListNodeHeap) Less(i int, j int) bool {
|
||||
if l[i] == nil {
|
||||
return true
|
||||
}
|
||||
|
||||
if l[j] == nil {
|
||||
return false
|
||||
}
|
||||
|
||||
return l[i].Val < l[j].Val
|
||||
}
|
||||
|
||||
func (l *ListNodeHeap) Pop() (popped any) {
|
||||
*l, popped = (*l)[:len(*l)-1], (*l)[len(*l)-1]
|
||||
return
|
||||
}
|
||||
|
||||
func (l *ListNodeHeap) Push(x any) {
|
||||
*l = append(*l, x.(*ListNode))
|
||||
}
|
||||
|
||||
func (l ListNodeHeap) Swap(i int, j int) {
|
||||
l[i], l[j] = l[j], l[i]
|
||||
}
|
||||
|
||||
func mergeKLists(lists []*ListNode) *ListNode {
|
||||
hp := ListNodeHeap(lists)
|
||||
heap.Init(&hp)
|
||||
|
||||
sorted := ListNode{}
|
||||
head := &sorted
|
||||
|
||||
for len(hp) > 0 {
|
||||
min := heap.Pop(&hp).(*ListNode)
|
||||
if min == nil {
|
||||
continue
|
||||
}
|
||||
|
||||
rest := min.Next
|
||||
|
||||
head.Next, head = min, min
|
||||
if rest != nil {
|
||||
heap.Push(&hp, rest)
|
||||
}
|
||||
}
|
||||
|
||||
return sorted.Next
|
||||
}
|
||||
Reference in New Issue
Block a user