热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【leetcode】23.合并K个排序链表

合并k个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。示例:输入:[1-4-5,1-3-4,2-6]输出:1-1-2-3-4-

合并 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。

示例:

输入:
[1->4->5,1->3->4,2->6
]
输出: 1->1->2->3->4->4->5->6

分析:

我想是k次归并。时间复杂度是(k-1)nlogn。

参考的思路是:

题目分析:本题首先将每个链表的首元素取出,构建一个最小堆。堆顶则为最小的元素,用最小元素所在的那个链表的第二个元素替换掉它的位置。然后维护最小堆的特性,再取出堆顶元素,……,一直到所有链表元素都取出为止。

时间复杂度分析:一共是K个链表,假设每个链表有n个元素,首先是K个链表首元素的建堆,花费O(K),然后取堆顶元素,用下一个元素替换掉它,维护最小堆的特性,花费O(lgK),共有K*n个元素,所以花费(K*n-1)*lgK的时间,故总时间为O(K*n*lgK)

我们用优先队列来实现,优先队列的底层是用堆实现的。所谓优先,指的是队列里的元素按照优先级大小排列,优先级大的排在前面,优先级相同的按照入队的顺序排列。首先将每个链表的首元素入队,将最小元素置于堆顶,然后找最小元素所在链表的下一个元素入队,一直到队为空。

from queue import PriorityQueue
# from heapq import heappush,heappop
class Solution(object):def mergeKLists(self, lists):dummy &#61; curr &#61; ListNode(None)q &#61; PriorityQueue()for idx,node in enumerate(lists):# 我的妈&#xff0c;链表竟然可以这样遍历# print(idx,node) # TypeError: &#39;ListNode&#39; object is not iterable# 不可以这样遍历- -if node:q.put((node.val,idx,node))# print(q.get()) # (1, 0, <__main__.ListNode object at 0x105d20518>)while not q.empty():# 最小的元素在链表尾部_,idx,curr.next &#61; q.get()curr &#61; curr.nextif curr.next:q.put((curr.next.val,idx,curr.next))return dummy.next

## using minheap
def mergeKLists2(self, lists):dummy &#61; curr &#61; ListNode(None)heap &#61; []for idx, node in enumerate(lists):if node:heappush(heap, (node.val, idx, node))while heap:_, idx, curr.next &#61; heappop(heap)curr &#61; curr.nextif curr.next:heappush(heap, (curr.next.val, idx, curr.next))return dummy.next

详细用法&#xff1a;Python堆和优先队列的使用


参考&#xff1a; 

原文&#xff1a;https://blog.csdn.net/Jaster_wisdom/article/details/81332854

https://leetcode.com/problems/merge-k-sorted-lists/discuss/261487/Simple-Python-solution-using-PriorityQueue-and-MinHeap


推荐阅读
  • 第七课主要内容:多进程多线程FIFO,LIFO,优先队列线程局部变量进程与线程的选择线程池异步IO概念及twisted案例股票数据抓取 ... [详细]
  • LeetCode笔记:剑指Offer 41. 数据流中的中位数(Java、堆、优先队列、知识点)
    本文介绍了LeetCode剑指Offer 41题的解题思路和代码实现,主要涉及了Java中的优先队列和堆排序的知识点。优先队列是Queue接口的实现,可以对其中的元素进行排序,采用小顶堆的方式进行排序。本文还介绍了Java中queue的offer、poll、add、remove、element、peek等方法的区别和用法。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • 本文介绍了如何通过维持两个堆来获取一个数据流中的中位数。通过使用最大堆和最小堆,分别保存数据流中较小的一半和较大的一半数值,可以保证两个堆的大小差距为1或0。如果数据流中的数量为奇数,则中位数为较大堆的最大值;如果数量为偶数,则中位数为较大堆的最大值和较小堆的最小值的平均值。可以使用优先队列来实现堆的功能。本文还提供了相应的Java代码实现。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
author-avatar
辽宁何氏医学院高明月
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有