LeetCode热题Hot100 - 合并K个升序链表

一刷~

给你一个链表数组,每个链表都已经按升序排列。

请你将所有链表合并到一个升序链表中,返回合并后的链表。

思路:

逆天了- -困难模式一次过- -

第一反应,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
相关推荐
rit843249910 分钟前
基于灰狼算法(GWO)优化支持向量回归机(SVR)参数C和γ的实现
c语言·算法·回归
蒋士峰DBA修行之路12 分钟前
实验五 静态剪枝
数据库·算法·剪枝
蒋士峰DBA修行之路15 分钟前
实验六 动态剪枝
数据库·算法·剪枝
Tim_1044 分钟前
【算法专题训练】20、LRU 缓存
c++·算法·缓存
Lris-KK1 小时前
【Leetcode】高频SQL基础题--1341.电影评分
sql·leetcode
B612 little star king1 小时前
力扣29. 两数相除题解
java·算法·leetcode
野犬寒鸦1 小时前
力扣hot100:环形链表(快慢指针法)(141)
java·数据结构·算法·leetcode·面试·职场和发展
时光追逐者1 小时前
C# 哈希查找算法实操
算法·c#·哈希算法
Jasmine_llq2 小时前
《P3825 [NOI2017] 游戏》
算法·游戏·枚举法·2-sat 算法·tarjan 算法·邻接表存储
Miraitowa_cheems2 小时前
LeetCode算法日记 - Day 38: 二叉树的锯齿形层序遍历、二叉树最大宽度
java·linux·运维·算法·leetcode·链表·职场和发展