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))
- // }
|