一刷~
给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
思路:
逆天了- -困难模式一次过- -
第一反应,n个列表,两两合并,n-1次遍历即可,但是这样n-1次排序会浪费很多时间。
第二反应,n个列表取头部node,n个node排序,取最小的,然后用同链表中次小的代替它。这样一来,需要对n个值不停排序。有没有不用一直排序,每次都取最小值的方法呢?
最小堆呀- -
用最小堆每次弹出n个node中最小的。那么最后一个问题,怎么确定最小的node属于哪个链表(因为要用同链表次小值代替它)?---索引堆。 Over- -
python
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
import heapq
class Solution:
def mergeKLists(self, lists: List[Optional[ListNode]]) -> Optional[ListNode]:
nodes = []
for i in range(len(lists)):
if lists[i]:
nodes.append([lists[i].val, i])
heapq.heapify(nodes)
head = ListNode(0)
p1 = head
while len(nodes):
_, idx = heapq.heappop(nodes)
p1.next = lists[idx]
lists[idx] = lists[idx].next
p1 = p1.next
if lists[idx]:
heapq.heappush(nodes, [lists[idx].val, idx])
return head.next