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
相关推荐
故事和你912 小时前
sdut-程序设计基础Ⅰ-实验五一维数组(8-13)
开发语言·数据结构·c++·算法·蓝桥杯·图论·类和对象
像污秽一样2 小时前
算法与设计与分析-习题4.2
算法·排序算法·深度优先·dfs·bfs
Storynone3 小时前
【Day20】LeetCode:39. 组合总和,40. 组合总和II,131. 分割回文串
python·算法·leetcode
明明如月学长3 小时前
AI 更新太快学不过来?我用OpenClaw打造专属AI学习工作流
算法
黎阳之光3 小时前
【黎阳之光:以无线专网与视频孪生,赋能智慧广电与数字中国】
算法·安全·智慧城市·数字孪生
刀法如飞4 小时前
Agentic AI时代,程序员必备的算法思想指南
人工智能·算法·agent
刀法如飞4 小时前
Agentic AI时代程序员必备算法思想详解(附实战案例)
算法·ai编程·编程开发·agentic
飞Link5 小时前
告别盲目找Bug:深度解析 TSTD 异常检测中的预测模型(Python 实战版)
开发语言·python·算法·bug
记忆多6 小时前
c++名字空间 函数模版 左右值
开发语言·c++·算法
三伏5226 小时前
控制理论前置知识——相平面数学基础2(示例部分)
算法·平面·控制