合并k个有序链表 python_leecode刷题(27)-- 合并k个排序链表
leecode刷题(27)-- 合并k个排序链表
合并k个排序链表
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
思路
以前做过合并两个有序链表的问题,所以刚开始想到的解法与之类似,我们可以先合并两个有序链表,再用合并的新链表去合并第三个链表:
1->1->3->4->4->5
1->1->2->3->4->4->5->6
其实如果我们学习过堆相关的知识,还可以用最小堆来解决这个问题:
读取所有链表值
构造一个最小堆(python中有 headp 方法,java中有 PriorityQueue 方法
根据最小堆构造一个链表
代码如下
python 描述
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
from heapq import heapify, heappop
class Solution:
def mergeKLists(self, lists: List[ListNode]) -> ListNode:
# 读取所有节点值
h = []
for node in lists:
while node:
h.append(node.val)
node = node.next
if not h:
return None
# 构造一个最小堆
heapify(h) # 转换为最小堆
# 构造链表
root = ListNode(heappop(h))
curnode = root
while h:
nextnode = ListNode(heappop(h))
curnode.next = nextnode
curnode = nextnode
return root
java 描述
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
// 读取所有节点值
List h = new ArrayList();
for (ListNode node: lists) {
while (node != null) {
h.add(node.val);
node = node.next;
}
}
// 构造一个最小堆
if (!h.isEmpty()) return null;
PriorityQueue priorityQueue = new PriorityQueue();
// 将元素添加进最小堆中
for (Integer h1: h) {
priorityQueue.offer(h1);
}
//构造链表
ListNode root = priorityQueue.poll();
ListNode curNode = root;
while (!priorityQueue.isEmpty()) {
ListNode nextNode = priorityQueue.poll();
curNode.next = nextNode;
curNode = nextNode;
}
return root;
}
}
总结
上述 python 的代码能通过提交,但是 java 代码部分我快被类型转换弄晕了,代码不能通过运行,这里只是给出一种思路,日后有时间自己会再完善的,写下来也是当作自己学习记录的一部分,希望看到文章的小伙伴能帮忙指出本人的不足。
合并k个有序链表 python_leecode刷题(27)-- 合并k个排序链表相关推荐
- list元素求和_LeetCode刷题实战82:删除排序链表中的重复元素 II
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...
- java二叉树转换为链表_leetcode刷题笔记-114. 二叉树展开为链表(java实现)
leetcode刷题笔记-114. 二叉树展开为链表(java实现) 题目描述 给你二叉树的根结点 root ,请你将它展开为一个单链表: 展开后的单链表应该同样使用 TreeNode ,其中 rig ...
- 力扣刷题之合并两个有序数组
力扣刷题之合并两个有序数组 题目 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目. 请你 合并 nu ...
- 【小f的刷题笔记】(JS)链表 - 合并 k 个有序链表 LeetCode23 - 顺序合并暴力三种方法
[链表] 合并 k 个有序链表:
- leetcode刷题:合并两个有序链表
题目: 分析思路: 1.新建一个哨兵结点,到时用于返回合并后新链表的头结点. 2.while循环,直到有一点链表到结尾为止 3.把非空的链表绑定到合并结点的尾部,并返回合并后链表的头结点. 代码如下: ...
- python两个数组合并、找出中位数_leetcode刷题记录-找出这两个有序数组的中位数(python版本)...
谨以此文记录一下自己刷题的过程,虽然技术能力一般,相信刷完整套题目自己的编程能力定会有提高,代码都是个人创作,不一定是最好的,仅供参考和交流 给定两个大小为 m 和 n 的有序数组 nums1 和 n ...
- 算法入门刷题笔记 Day2 K - Coat of Anticubism L - Five-In-a-Row M - Island Puzzl......
写在前面 好久没更新公众号和博客了,因为最近在研究新的方向,所以很少发文. 笔者接触编程只有一年,这一年间主要研究启发式算法在运筹学中的应用.但是由于编程基础薄弱,在进一步研究复杂运筹学问题时发现基础 ...
- LeetCode779 第K个语法符号 python刷题Day5
779.第K个语法符号 差一点今天就前功尽弃了,瘫在沙发上一时爽,一直瘫着废到老.想想昨天被一道评级为简单的题困住了.虽然我上学上的久,但我学的东西少啊.好了,开正题了,士可以一日不食而不能半日不学. ...
- 堆排序时间复杂度_leetcode刷题(二):排序算法(归并排序,堆排序,桶排序)...
今天,我们要来讲讲排序问题,这次讲的排序算法主要是归并排序,堆排序和桶排序. 归并排序 归并一词在中文的含义就是"合并,并入"的意思,在数据结构里面就是将两个或者两个以上的有序数组 ...
- 算法入门刷题笔记 Day10 - A - 拓扑排序·一 -- D - K-th Path
写在前面 好久没更新公众号和博客了,因为最近在研究新的方向,所以很少发文. 笔者接触编程只有一年,这一年间主要研究启发式算法在运筹学中的应用.但是由于编程基础薄弱,在进一步研究复杂运筹学问题时发现基础 ...
最新文章
- 智能集群理论优化控制_无人机集群对抗研究的关键问题
- 共享单车数据集_共享单车数据可视化报告
- SpringBoot默认日志logback配置解析
- POS机刷卡机招商加盟企业网站源码
- oracle的reliable message等待事件
- idea设置类多行显示_IDEA 常用设置
- 软件汉化工具:eXeScope
- Win7双屏显示设置
- 屋面光伏荷载计算机构,有关光伏发电屋顶荷载以及预判方法
- java 读取pdf表格_在Java中使用tabula提取PDF中的表格数据
- winhex查看mysql_使用WINHEX查看innodb的BTree高度
- 全网最易懂的Flink背压问题,看不懂你打我~
- 独家-县域统计年鉴Excel版(2000-2021年)-包含县市及乡镇卷
- js把日期字符串转换成时间戳 阿星小栈
- C语言实现双向非循环链表(不带头结点)的基本操作
- Ubuntu20.04开放指定端口
- 信息学奥赛的“一二三四”
- Postman发送一个请求
- WIN2003安装SQL2000时验证CDKEY
- Docker Swarm 快速入门
热门文章
- Python全栈之路系列之列表数据类型
- 编码风格之变量的命名规则
- JS 表单submit() 提交无效的问题
- s3c2440的pwm输出
- 关系分析可视化插件-Cytoscape
- Python使用matplotlib可视化模拟班级学生分数柱状图和折线图
- tp5.0 根据经纬度 获取附近信息_Redis怎么实现查找附近的人之数据类型Geospatial...
- hive 建表_大数据面试必备 | Hive数据仓工具面试题!
- iphone新旧手机数据传输已取消_iPhone 手机支付宝自动扣费?取消服务提示“无法解约”?...
- 真正解决:gpg --verify sig: 无法检查签名:找不到公钥