题目地址:https://leetcode.cn/problems/merge-k-sorted-lists/description/
算法思路:
先把每个链表的头加入小顶堆 ,把堆顶节点加入head并出堆,
如果这个节点的下一个元素不为空则加入堆并调整
直到所有元素全部出堆
具体实现如下
go
func mergeKLists(lists []*ListNode) *ListNode {
size := 0
heap := []*ListNode{}
for i := 0; i < len(lists); i++ {
if lists[i] != nil {
size++
heap = append(heap, lists[i])
}
}
if size == 0 {
return nil
}
for i := size/2 - 1; i >= 0; i-- {
heapify(heap, i, size)
}
head := &ListNode{}
tail := head
for size > 0 {
minNode := heap[0]
tail.Next = minNode
tail = tail.Next
if minNode.Next != nil {
heap[0] = minNode.Next
heapify(heap, 0, size)
} else {
size--
swap(heap, 0, size)
heapify(heap, 0, size)
}
}
return head.Next
}
// 调整小顶堆
func heapify(heap []*ListNode, i, size int) {
left := i*2 + 1
small := left
for left < size {
small = left
if small+1 < size && heap[small].Val > heap[small+1].Val {
small = left + 1
}
if heap[small].Val < heap[i].Val {
swap(heap, small, i)
i = small
left = i*2 + 1
} else {
break
}
}
}
func swap(heap []*ListNode, i, j int) {
heap[i], heap[j] = heap[j], heap[i]
}