| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 | package main// MinPQ ...type MinPQ []*ListNode// Insert ...func (pq *MinPQ) Insert(node *ListNode) {	*pq = append(*pq, node)	pq.swim(pq.Size())}// Min ...func (pq *MinPQ) Min() *ListNode {	return (*pq)[0]}// DelMin ...func (pq *MinPQ) DelMin() *ListNode {	min := (*pq)[0]	size := pq.Size()	pq.exch(1, size)	*pq = (*pq)[:size-1]	pq.sink(1)	return min}// Empty ...func (pq *MinPQ) Empty() bool {	return pq.Size() == 0}// Size ...func (pq *MinPQ) Size() int {	return len(*pq)}// Note: i, j is NOT the index of element, but the rank of it.func (pq *MinPQ) less(i, j int) bool {	return (*pq)[i-1].Val < (*pq)[j-1].Val}func (pq *MinPQ) exch(i, j int) {	(*pq)[i-1], (*pq)[j-1] = (*pq)[j-1], (*pq)[i-1]}func (pq *MinPQ) swim(k int) {	for k > 1 && pq.less(k, k/2) {		pq.exch(k, k/2)		k /= 2	}}func (pq *MinPQ) sink(k int) {	size := pq.Size()	for 2*k <= size { // !!		j := 2 * k		if j < size && pq.less(j+1, j) {			j++ // Compare with the less child		}		if !pq.less(j, k) {			break // If j !< k, ie. k <= j, break		}		pq.exch(k, j)		k = j	}}/** * Definition for singly-linked list. * type ListNode struct { *     Val int *     Next *ListNode * } */func mergeKLists(lists []*ListNode) *ListNode {	k := len(lists)	if k == 0 {		return nil	}	dummy := ListNode{}	curr := &dummy	var pq MinPQ	for _, head := range lists {		if head != nil {			pq.Insert(head)		}	}	for !pq.Empty() {		min := pq.DelMin()		curr.Next = min		curr = curr.Next		// pq is empty, or not empty && next min != min		// Not empty && next min == min		if pq.Empty() || pq.Min().Val != min.Val {			if min.Next != nil {				pq.Insert(min.Next)			}		} else {			nexts := make([]*ListNode, 0, pq.Size())			if min.Next != nil {				nexts = append(nexts, min.Next)			}			for !pq.Empty() && pq.Min().Val == min.Val {				min = pq.DelMin()				curr.Next = min				curr = curr.Next				if min.Next != nil {					nexts = append(nexts, min.Next)				}			}			for _, next := range nexts {				pq.Insert(next)			}		}	}	return dummy.Next}// func main() {// 	l1 := toLinkedList([]int{-9, -7, -7})// 	l2 := toLinkedList([]int{-6, -4})// 	l3 := toLinkedList([]int{-6, -5})// 	l4 := toLinkedList([]int{-9, -8, -6})// 	l5 := toLinkedList([]int{-10})// 	l6 := toLinkedList([]int{-5})// 	lists := []*ListNode{l1, l2, l3, l4, l5, l6}// 	var pq MinPQ// 	pq.Insert(&ListNode{-9, nil})// 	pq.Insert(&ListNode{-6, nil})// 	pq.Insert(&ListNode{-6, nil})// 	pq.Insert(&ListNode{-9, nil})// 	pq.Insert(&ListNode{-10, nil})// 	pq.Insert(&ListNode{-5, nil})// 	for !pq.Empty() {// 		println(pq.DelMin().Val)// 	}// 	printList(mergeKLists(lists))// }
 |