题解 | #合并k个已排序的链表#
合并k个已排序的链表
https://www.nowcoder.com/practice/65cfde9e5b9b4cf2b6bafa5f3ef33fa6
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param lists ListNode类一维数组
# @return ListNode类
#
import heapq
class Solution:
def mergeKLists(self , lists: List[ListNode]) -> ListNode:
# write code here
heap = [] # 创建堆
# 将每个链表的第一个值加入堆,同时将各个链表的头指针往后移动一位
for i in range(len(lists)):
if lists[i]:
heapq.heappush(heap, (lists[i].val, i))
lists[i] = lists[i].next
dummy_head = ListNode(-1)
cur = dummy_head
while heap:
val, i = heapq.heappop(heap)
node = ListNode(val)
cur.next = node
cur = cur.next
if lists[i]:
heapq.heappush(heap, (lists[i].val, i))
lists[i] = lists[i].next
return dummy_head.next
思路:使用最小堆来每次pop出每个链表头结点中的最小值
- 构建最小堆,将所有链表的头结点push到堆中;
- 只要堆不为空,每次pop出当前堆中的最小值,并加入pop出的这个值所在链表的下一个值
为此,在构建堆时,不仅需要记录值,还需要记录该值来自于那个链表。
海康威视公司福利 1277人发布