2021-06-26 合并k个有序链表

合并K个有序链表(java) 1.使用优先级队列来解决问题,将链表的头节点放入优先级队列中,每次从队列中取出链表的节点,然后将链表的下个节点放入优先级队列中,重复以上操作,直至队列中没有链表为止。方法使用分治法将链表数组划分为两部分,然后递归地合并左半部分和右半部分。前言:由于平时荒废了学习工作,等到想要找工作才发现已经遗忘忘了,开始重新刷算法题。合并两个有序链表已经知道怎么做了,那么如果合并多个有序链表呢?方法中完成,将两个链表按升序合并成一个。类,其中包含了合并k个有序链表的方法。方法来递归地合并所有的链表。 阅读详情

leetcode每日一题之合并k个有序链表

题目链接:https://leetcode-cn.com/problems/merge-k-sorted-lists/

题目描述:

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

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

示例:

输入:lists = [[1,4,5],[1,3,4],[2,6]]
输出:[1,1,2,3,4,4,5,6]
解释:链表数组如下:
[
  1->4->5,
  1->3->4,
  2->6
]
将它们合并到一个有序链表中得到。
1->1->2->3->4->4->5->6

输入:lists = []
输出:[]

输入:lists = [[]]
输出:[]

解法1:

两个两个得合并,需要用到合并两个有序链表的代码,非常简单,代码如下:

    public ListNode mergeKLists(ListNode[] lists) {
            //数组中没有元素或者只有一个空元素
            if (lists.length == 0 || lists == null) {
                return null;
            }
            //也就是将lists[0]和lists[1]合并成为lists[0-1],然后将lists[0-1]和之后得一个再次合并
            ListNode res = lists[0];
            for (int i = 1; i < lists.length; i++) {
                res = mergeTwoLists(res, lists[i]);
            }
            return res;
        }
    
        //两两合并链表
        public static ListNode mergeTwoLists(ListNode l1, ListNode l2) {
            //定义一个新的链表来连接
            ListNode listNode = new ListNode(-1);
            ListNode head = listNode;
            //1.如果两个链表中有一个为空,则直接返回另外一个链表
            if (l1 == null || l2 == null) {
                return l1 == null ? l2 : l1;
            }
            //2.如果两个链表都不为空且长度一样
            //输入:l1 = [1,2,4], l2 = [1,3,4]  输出:[1,1,2,3,4,4]
            while (l1 != null && l2 != null) {
                if (l1.val <= l2.val) {
                    listNode.next = l1;
                    l1 = l1.next;
                } else {
                    listNode.next = l2;
                    l2 = l2.next;
                }
                listNode = listNode.next;
            }
            //如果两个链表长度不一样
            listNode.next = (l1 == null ? l2 : l1);
            return head.next;
        }

解法2:使用堆排序。

代码:

    //使用堆排序
        public ListNode mergeKLists2(ListNode[] lists) {
            if (lists == null || lists.length == 0) {
                return null;
            }
            //创建一个堆,并设置元素得排序方式
            PriorityQueue<ListNode> queue = new PriorityQueue<>(new Comparator<ListNode>() {
                @Override
                public int compare(ListNode o1, ListNode o2) {
                    return o1.val - o2.val;
                }
            });
            //输入:lists = [[1,4,5],[1,3,4],[2,6]]
            //输出:[1,1,2,3,4,4,5,6]
            //遍历链表数组,然后将链表得每个节点都放入堆中
            for (int i = 0; i < lists.length; i++) {
                while (lists[i] != null) {//lists[i] 表示链表得头节点
                    queue.add(lists[i]);
                    lists[i] = lists[i].next;
                }
            }
            ListNode dummy = new ListNode(0);
            ListNode head = dummy;
            //从堆中不断取出元素,并将这些元素串起来
            while (!queue.isEmpty()) {
                dummy.next = queue.poll();
                dummy = dummy.next;
            }
            dummy.next = null;
            return head.next;
        }
    

解法3:分治算法

代码:

    //分治[分为分解和合并两个步骤]
        //分治就是不断缩小问题规模,再不断合并扩大得过程
        public ListNode mergeKLists3(ListNode[] lists) {
            if (lists == null || lists.length == 0) {
                return null;
            }
            return hepler(lists, 0, lists.length - 1);
        }
    
        public ListNode hepler(ListNode[] lists, int begin, int end) {
            if (begin == end) {
                return lists[begin];
            }
            int mid = begin + (end - begin) >> 2;
            ListNode left = hepler(lists, begin, mid);
            ListNode right = hepler(lists, mid + 1, end);
            return mergeTwoLists2(left, right);
        }
    
        public static ListNode mergeTwoLists2(ListNode l1, ListNode l2) {
            //定义一个新的链表来连接
            ListNode listNode = new ListNode(-1);
            ListNode head = listNode;
            //1.如果两个链表中有一个为空,则直接返回另外一个链表
            if (l1 == null || l2 == null) {
                return l1 == null ? l2 : l1;
            }
            //2.如果两个链表都不为空且长度一样
            //输入:l1 = [1,2,4], l2 = [1,3,4]  输出:[1,1,2,3,4,4]
            while (l1 != null && l2 != null) {
                if (l1.val <= l2.val) {
                    listNode.next = l1;
                    l1 = l1.next;
                } else {
                    listNode.next = l2;
                    l2 = l2.next;
                }
                listNode = listNode.next;
            }
            //如果两个链表长度不一样
            listNode.next = (l1 == null ? l2 : l1);
            return head.next;
        }
LeetCode 热题 100 回顾 力扣最受刷题发烧友欢迎的 100 道题 LeetCode 热题 100 : 题目回顾、解题思路、复杂度分析、代码实现、验证算法 阅读详情

相关推荐

LeetCode 面试经典 150 题回顾

最经典 150 题,掌握面试所有知识点 面试经典 150 题 : 题目分析、解题思路、复杂度分析、代码展示

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 8万+

【C/C++练习】合并k个已排序的链表

今天给大家分享一道面试中常见的题目——合并K个升序链表,我会用暴力和分治两钟方法去求解这道题目,通过动图展示问题求解的全过程。这里提醒大家,画图是我们求解复杂问题的有效手段,有时可以起到事半功倍的效果,各位小伙伴在做题的过程中如果遇到麻烦,不妨动手画画图哟。

春人.的博客 6998

同济大学C++mooc第五、六讲参考答案

同济大学C++moooc第5、6讲 第五讲 第一题 随机产生10个30~100(包括30,100)的正整数,求它们的最大值、最小值、平均值,并显示整个数组的值和结果。 代码片. // #include<iostream> const int n = 10; using namespace std; int main() { int s[n],i,j,t,sum=0; for (i = 0; i < n; i++)

cjzui6666的博客 1万+

合并K个有序链表CPP

mergeKlist

m0_60007338的博客 241

JaCoCo报告聚合的5个常见坑点排查指南:从单模块到多模块的完整避坑手册

本文详细解析了JaCoCo在多模块Maven项目中生成聚合报告时的5个常见问题,包括多模块报告聚合失效、覆盖率数据不一致、增量构建导致的覆盖率丢失等,并提供了具体的配置示例和解决方案。帮助开发者高效排查和解决JaCoCo报告聚合中的各种疑难杂症,提升代码覆盖率分析的准确性和效率。

weixin_27918373的博客 250

SPICE仿真软件:HSPICE_(20).HSPICE仿真结果的后处理

HSPICE仿真结果的后处理是一个多步骤的过程,包括读取结果文件、可视化、分析和导出。通过使用命令行工具、Python脚本和HSPICE内置工具,可以高效、准确地完成这些任务。Python脚本的灵活性和强大的数据分析能力使其成为后处理的理想选择。自动化处理可以显著提高工作效率,减少人为错误,而高级分析方法可以更深入地理解仿真结果,为电路设计提供有力支持。

kkchenjj的博客 1382

23. 合并K个排序链表(java)

23. 合并K个排序链表 题目描述 合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] 输出: 1->1->2->3->4->4->5->6 解法一:计数法 将所有的链表全部暂存在数组来计数 通过计数情况全部有序放进新创建的链表 class Solution { public ListNode mergeKLists(ListNode

m0_37605197的博客 880

【硬件】LT3763中文手册

1)精确控制输入和输出电流;2) 3000:1真彩色PWM™调光;3) ±1.5%电压调节精度;4) ±6%电流调节精度;5)6V至60 V输入电压范围;6)宽输出范围最高可达55V;7)<2µA关断电流;8)用于负载电流热控制的控制引脚;9)输入和输出电流监控和限制;10)开路、短路和C/10故障检测;11)适用于LED应用的PWM驱动器输出;12)热增强型28引脚FE封装。

qq_39200110的博客 489

leetcode——合并K个有序链表(java)

继续加油,这道题并不难,考的是优先队列,多练就好

W_L_MM的博客 682

Qt实现离线缓存地图(附完整源码)

Qt实现离线缓存地图(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 858

液滴碰撞壁面的过程背景论文——bouncing反弹,spreading扩展,splashing飞溅。铺展过程介绍。还存在很多未解之谜。

【1993-德国-Phenomena of liquid drop impact on solid and liquid surfaces】液滴碰撞壁面的过程背景——bouncing反弹,spreading扩展,splashing飞溅。还存在很多未解之谜。还存在很多未解之谜。不同液滴形状碰撞过程。

qq_15963745的博客 200

有序链表的归并

Problem Description 分别输入两个有序的整数序列(分别包含M和N个数据),建立两个有序的单链表,将这两个有序单链表合并成为一个大的有序单链表,并依次输出合并后的单链表数据。 Input 第一行输入M与N的值;  第二行依次输入M个有序的整数; 第三行依次输入N个有序的整数。 Output 输出合并后的单链表所包含的M+N个有序的整数。 Ex

zhj9579的博客 1225

Open3D (C++) 点云边界提取【2025最新版】

Compute the boundary points of a point cloud.The implementation is inspired by the PCL implementation. Reference:https://pointclouds.org/documentation/classpcl_1_1_boundary_estimation.html

点云侠的博客 871

有序链表的归并 分类: 链表 2015-06-...

数据结构实验之链表四:有序链表的归并 TimeLimit: 1000MS Memory limit: 65536K 题目描述 分别输入两个有序的整数序列(分别包含M和N个数据),建立两个有序的单链表,将这两个有序单链表合并成为一个大的有序单链表,并依次输出合并后的单链表数据。 输入 第一行输入M与N的值; 第二行依次输入M个有序的整数; 第三行依次输入N个有序的整数。 输出...

weixin_30832143的博客 181

多周期路径约束(set_multicycle_path )

1.由慢到快的多周期约束 如下图所示,发射时钟周期是接受时钟周期的4倍。默认情况下,按照1T原则来进行静态时序分析和布局布线的。即建立时间是在发射沿后的第一个捕获沿检查,而保持时间是同一时刻下源时钟和捕获时钟的触发边沿下检查的(建立时间检查边沿的前一个触发沿)。 但是这样导致的问题就是该路径过于苛刻,为了满足这条路径的要求,不得不放弃其他路径。或者根本没办法保证这个默认的约束。总之最终造成...

Arist. 5506

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

数据结构及算法技巧-原理

能帮到你的话,就给个赞吧 😘。

qq_42863961的博客 447

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

学习记录 java 链表知识

01.import java.util.HashMap; 02.import java.util.Scanner; 03.import java.util.Stack; 04. 05./** 06. * 07. * @author kerryfish 08. * 关于java中链表的操作 09. * 1. 求单链表中结点的个数: getListLeng...

weixin_30270889的博客 111

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

算法合集

算法合集 第03课:数组、链表、跳表 数组: 1.两数之和(暴力,哈希)2 11. 盛最多水的容器(暴力法,双指针)2 15. 三数之和(双指针,暴力)2 26. 删除排序数组中的重复项(双指针) 66. 加一(逻辑)1 70. 爬楼梯(动态规划,暴力)2 88. 合并两个有序数组(逻辑,倒插法)2 189. 旋转数组(暴力法,额外数组法)2 283. 移动零(逻辑)2 链表: 21. 合并两个有序链表(迭代,递归)2 24. 两两交换链表中的节点(迭代) 25. K 个一组翻.

weixin_44593504的博客 444

剑指Offer系列——每日一题(持续更新)

算法题:就是确定需要使用哪种遍历算法、哪个数据结构来解题。

qq28117036的博客 370

15数字华容道解法 图解_【开源推荐】5k优秀算法图解项目大厂必备

“阅读本文大概需要 5 分钟。” 2020年第 23篇文章推荐良好的习惯是人生产生复利的有力助手本次由七夜Robot为大家推荐一个5k优秀算法图解项目,是作者在疫情期间完成的,制作了算法的图解版,非常感谢。同时项目还在持续更新,敬请期待,希望对大家有帮助。https://github.com/geekxh/hello-algorithm本项目包括:三十万字图解算法题典1...

weixin_28976179的博客 2084

LeetCode刷题精选(基于LeetCode企业题库2021年一月截止,字节,美团,网易,阿里,腾讯,共同题目)

LeetCode刷题精选(基于LeetCode企业题库2021年一月截止,字节,美团,网易,阿里,腾讯,共同题目) 两数之和 对称二叉树 二叉树的层序遍历 二叉树的最大深度 从前序与中序遍历序列构造二叉树 盛最多水的容器 交替打印FooBar 买卖股票的最佳时机 买卖股票的最佳时机 II 二叉树中的最大路径和 最长连续序列 分割回文串 复制带随机指针的链表 最长公共前缀 环形链表 环形链表 II 重排链表 二叉树的前序遍历 二叉树的后序遍历 LRU 缓存机制 对链表进行插入排序 直线上最多的点数 三数之和

weixin_42620179的博客 1717

牛客Leetcode高频题解(上)

Leetcode 题解: 1、NC78 反转链表 (1)使用栈解法: import java.util.Stack; public class Solution { public ListNode ReverseList(ListNode head) { Stack<ListNode> stack= new Stack<>(); //把链表节点全部摘掉放到栈中 while (head != null) { stack.pu

feiyan的博客 882

LeetCode刷题笔记

方便于记忆,力扣的笔记。

q952194436的博客 1325

腾讯精选练习 50 题(Leetcode)笔记 PDF下载!

昨天在知识星球中立了一个Flag,第一步采取的行动就是把以前刷的“腾讯精选练习 50 题”重新梳理一下,就有了今天这本170多页的小册子。 这本小册子即可以作为学习数据结构与算法课程的参考资料,也可以作为备考计算机类研究生的备考资料。希望对学习算法的同学们有所帮助。 这本小册子,主要是对我们第一次“数据结构与算法(Leetcode)刻意练习”中,在自己公众号所发打卡图文的重新梳理与总结,有部分代...

老马的程序人生 1095

蓝桥杯刷题单

33、最后一块石头的重量 II( LeetCode 1049 )27、买卖股票的最佳时机 II( LeetCode 122 )13、第一个错误的版本( LeetCode 278 )20、位 1 的个数( LeetCode 191 )34、组合总和 II( LeetCode 216 )20、不同的二叉搜索树( LeetCode 96 )29、组合总和 II( LeetCode 40 )32、接雨水 II( LeetCode 407 )6、零钱兑换 II( LeetCode 518 )

m0_73879806的博客 2014

【算法题类型总结】

一、旋转数组问题 旋转数组,都用二分法的思路解决。 1、轮转数组 思路:这是408里面经典的一道题目,主要考虑用3次翻转操作,实现空间复杂度O(1)。 class Solution { public: void rotate(vector<int>& nums, int k) { int len = nums.size(); k = k%len; // 这里取模,因为有可能k会大于数组长度 int res = len

qq_43557445的博客 5015
上一篇: 2021-06-25两两交换链表中得节点
下一篇: 2021-06-28旋转链表
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值