题目描述
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
分析解答
问题的核心在于每次需要找到当前K个链表表头的最小值,这和二叉堆的有序性相吻合,因此本题可以借助于一个最小化堆来解决。初始化一个最小化堆,将K个链表的表头节点依次入堆,为了能够比较不同节点间的大小,可以通过一个二元组(value,node)来实现。然后不停地执行出堆操作,每次取出的即为当前最小的节点。如果该节点有后继结点,则继续将后继结点入堆,直至堆为空,说明我们已经遍历过了所有链表中的全部节点。按照上述方案实现的代码如下:
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def mergeKLists(self, lists):
"""
:type lists: List[ListNode]
:rtype: ListNode
"""
from heapq import heappush, heappop
if not lists:
return None
h = []
for node in lists:
if node is not None:
heappush(h, (node.val, node))
head = ListNode(-1)
curr = head
while h:
node_tuple = heappop(h)
curr.next = node_tuple[1]
curr = curr.next
if curr.next is not None:
heappush(h, (curr.next.val, curr.next))
return head.next
值得一提的是,Python中的heapq
模块只是实现了堆操作中的相关算法,并没有提供一个封装好的类,所以需要自己初始化一个数组作为堆的容器。
今天的分享就是这些,我们下期再见!
以上就是本文的全部内容,如果您喜欢这篇文章,欢迎将它分享给朋友们。
感谢您的阅读,祝您生活愉快!
作者:小美哥
2019-03-20