52 lines
975 B
Go
52 lines
975 B
Go
package q23
|
|
|
|
import "container/heap"
|
|
|
|
type ListNode struct {
|
|
Val int
|
|
Next *ListNode
|
|
}
|
|
|
|
type MinNodeHp []*ListNode
|
|
|
|
func (m *MinNodeHp) Len() int { return len(*m) }
|
|
func (m *MinNodeHp) Less(i int, j int) bool { return (*m)[i].Val < (*m)[j].Val }
|
|
func (m *MinNodeHp) Push(x any) { *m = append(*m, x.(*ListNode)) }
|
|
func (m *MinNodeHp) Swap(i int, j int) { (*m)[i], (*m)[j] = (*m)[j], (*m)[i] }
|
|
|
|
func (m *MinNodeHp) Pop() any {
|
|
*m = (*m)[:len(*m)-1]
|
|
return nil
|
|
}
|
|
|
|
var _ heap.Interface = &MinNodeHp{}
|
|
|
|
func mergeKLists(lists []*ListNode) *ListNode {
|
|
hp := make(MinNodeHp, 0, len(lists))
|
|
for i := range lists {
|
|
if lists[i] != nil {
|
|
hp = append(hp, lists[i])
|
|
}
|
|
}
|
|
heap.Init(&hp)
|
|
|
|
head := &ListNode{}
|
|
tail := head
|
|
|
|
for len(hp) > 0 {
|
|
tail.Next = hp[0]
|
|
tail = tail.Next
|
|
|
|
hp[0] = hp[0].Next
|
|
if hp[0] == nil {
|
|
heap.Remove(&hp, 0)
|
|
} else {
|
|
heap.Fix(&hp, 0)
|
|
}
|
|
}
|
|
|
|
tail.Next = nil
|
|
return head.Next
|
|
}
|
|
|
|
var _ = mergeKLists
|