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