23.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. package main
  2. // MinPQ ...
  3. type MinPQ []*ListNode
  4. // Insert ...
  5. func (pq *MinPQ) Insert(node *ListNode) {
  6. *pq = append(*pq, node)
  7. pq.swim(pq.Size())
  8. }
  9. // Min ...
  10. func (pq *MinPQ) Min() *ListNode {
  11. return (*pq)[0]
  12. }
  13. // DelMin ...
  14. func (pq *MinPQ) DelMin() *ListNode {
  15. min := (*pq)[0]
  16. size := pq.Size()
  17. pq.exch(1, size)
  18. *pq = (*pq)[:size-1]
  19. pq.sink(1)
  20. return min
  21. }
  22. // Empty ...
  23. func (pq *MinPQ) Empty() bool {
  24. return pq.Size() == 0
  25. }
  26. // Size ...
  27. func (pq *MinPQ) Size() int {
  28. return len(*pq)
  29. }
  30. // Note: i, j is NOT the index of element, but the rank of it.
  31. func (pq *MinPQ) less(i, j int) bool {
  32. return (*pq)[i-1].Val < (*pq)[j-1].Val
  33. }
  34. func (pq *MinPQ) exch(i, j int) {
  35. (*pq)[i-1], (*pq)[j-1] = (*pq)[j-1], (*pq)[i-1]
  36. }
  37. func (pq *MinPQ) swim(k int) {
  38. for k > 1 && pq.less(k, k/2) {
  39. pq.exch(k, k/2)
  40. k /= 2
  41. }
  42. }
  43. func (pq *MinPQ) sink(k int) {
  44. size := pq.Size()
  45. for 2*k <= size { // !!
  46. j := 2 * k
  47. if j < size && pq.less(j+1, j) {
  48. j++ // Compare with the less child
  49. }
  50. if !pq.less(j, k) {
  51. break // If j !< k, ie. k <= j, break
  52. }
  53. pq.exch(k, j)
  54. k = j
  55. }
  56. }
  57. /**
  58. * Definition for singly-linked list.
  59. * type ListNode struct {
  60. * Val int
  61. * Next *ListNode
  62. * }
  63. */
  64. func mergeKLists(lists []*ListNode) *ListNode {
  65. k := len(lists)
  66. if k == 0 {
  67. return nil
  68. }
  69. dummy := ListNode{}
  70. curr := &dummy
  71. var pq MinPQ
  72. for _, head := range lists {
  73. if head != nil {
  74. pq.Insert(head)
  75. }
  76. }
  77. for !pq.Empty() {
  78. min := pq.DelMin()
  79. curr.Next = min
  80. curr = curr.Next
  81. // pq is empty, or not empty && next min != min
  82. // Not empty && next min == min
  83. if pq.Empty() || pq.Min().Val != min.Val {
  84. if min.Next != nil {
  85. pq.Insert(min.Next)
  86. }
  87. } else {
  88. nexts := make([]*ListNode, 0, pq.Size())
  89. if min.Next != nil {
  90. nexts = append(nexts, min.Next)
  91. }
  92. for !pq.Empty() && pq.Min().Val == min.Val {
  93. min = pq.DelMin()
  94. curr.Next = min
  95. curr = curr.Next
  96. if min.Next != nil {
  97. nexts = append(nexts, min.Next)
  98. }
  99. }
  100. for _, next := range nexts {
  101. pq.Insert(next)
  102. }
  103. }
  104. }
  105. return dummy.Next
  106. }
  107. // func main() {
  108. // l1 := toLinkedList([]int{-9, -7, -7})
  109. // l2 := toLinkedList([]int{-6, -4})
  110. // l3 := toLinkedList([]int{-6, -5})
  111. // l4 := toLinkedList([]int{-9, -8, -6})
  112. // l5 := toLinkedList([]int{-10})
  113. // l6 := toLinkedList([]int{-5})
  114. // lists := []*ListNode{l1, l2, l3, l4, l5, l6}
  115. // var pq MinPQ
  116. // pq.Insert(&ListNode{-9, nil})
  117. // pq.Insert(&ListNode{-6, nil})
  118. // pq.Insert(&ListNode{-6, nil})
  119. // pq.Insert(&ListNode{-9, nil})
  120. // pq.Insert(&ListNode{-10, nil})
  121. // pq.Insert(&ListNode{-5, nil})
  122. // for !pq.Empty() {
  123. // println(pq.DelMin().Val)
  124. // }
  125. // printList(mergeKLists(lists))
  126. // }