图片.png

    图片.png
    优先队列或者进行排序

    1. package main
    2. import (
    3. "container/heap"
    4. "fmt"
    5. "sort"
    6. )
    7. type ListNode struct {
    8. Val int
    9. Next *ListNode
    10. }
    11. type NodeSlice []*ListNode
    12. func (p NodeSlice) Len() int { return len(p) }
    13. func (p NodeSlice) Less(i, j int) bool { return p[i].Val < p[j].Val }
    14. func (p NodeSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
    15. func (p *NodeSlice) Push(x interface{}) {
    16. node := x.(*ListNode)
    17. *p = append(*p, node)
    18. }
    19. func (p *NodeSlice) Pop() interface{} {
    20. old := *p
    21. n := len(old)
    22. item := old[n-1]
    23. *p = old[0 : n-1]
    24. return item
    25. }
    26. func mergeKLists(lists []*ListNode) *ListNode {
    27. dummyHead := &ListNode{
    28. Val: -1,
    29. Next: nil,
    30. }
    31. curr := dummyHead
    32. nodeList := make(NodeSlice, 0)
    33. for i := range lists {
    34. if lists[i] != nil {
    35. nodeList = append(nodeList, lists[i])
    36. }
    37. }
    38. heap.Init(&nodeList)
    39. for len(nodeList) > 0 {
    40. item := heap.Pop(&nodeList).(*ListNode)// 最小元素
    41. next := item.Next
    42. item.Next = nil
    43. curr.Next = item
    44. curr = item
    45. if next != nil {
    46. heap.Push(&nodeList, next)
    47. }
    48. }
    49. return dummyHead.Next
    50. }
    51. func mergeKLists1(lists []*ListNode) *ListNode {
    52. dummyHead := &ListNode{
    53. Val: -1,
    54. Next: nil,
    55. }
    56. nodeList := make(NodeSlice, 0)
    57. for i := range lists {
    58. h :=lists[i]
    59. for h!= nil {
    60. nodeList = append(nodeList, h)
    61. h=h.Next
    62. }
    63. }
    64. sort.Sort(nodeList)
    65. curr := dummyHead
    66. for _,v :=range nodeList{
    67. curr.Next = v
    68. curr = v
    69. }
    70. return dummyHead.Next
    71. }
    72. func main() {
    73. a1 :=ListNode{Val: 1,}
    74. b1 :=&ListNode{Val: 4,}
    75. a1.Next = b1
    76. c1 :=ListNode{Val: 5,}
    77. b1.Next =&c1
    78. a2 :=ListNode{Val: 1,}
    79. b2 :=ListNode{Val: 3,}
    80. a2.Next = &b2
    81. c2 :=ListNode{Val: 4,}
    82. b2.Next =&c2
    83. a3 :=ListNode{Val: 2,}
    84. b3 :=ListNode{Val: 6,}
    85. a3.Next =&b3
    86. r := mergeKLists([]*ListNode{&a1,&a2,&a3,nil})
    87. for r!= nil{
    88. fmt.Println(r.Val)
    89. r = r.Next
    90. }
    91. }

    // [[-6,-4,0,0,4],[],[-4,-2,-1,1,2,3],[-9,-6,-5,-2,4,4],[-9,-6,-5,-2,-1,3],[-2,-1,0],[-6],[-8,-1,0,2]]