LeetCode 合并K个升序链表
题目地址:https://leetcode.cn/problems/merge-k-sorted-lists/description/
算法思路:
先把每个链表的头加入小顶堆,把堆顶节点加入head并出堆,
如果这个节点的下一个元素不为空则加入堆并调整
直到所有元素全部出堆
具体实现如下
func mergeKLists(lists []*ListNode) *ListNode {size := 0heap := []*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 := headfor size > 0 {minNode := heap[0]tail.Next = minNodetail = tail.Nextif minNode.Next != nil {heap[0] = minNode.Nextheapify(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 + 1small := leftfor left < size {small = leftif 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 = smallleft = i*2 + 1} else {break}}
}func swap(heap []*ListNode, i, j int) {heap[i], heap[j] = heap[j], heap[i]
}