K个排序链表的合并(Hard)
问题来源:选自leetCode 23:合并K个排序链表
问题描述:
题目给定信息:
不确定需要合并的链表的数目,但依然要求我们把给定的这些有序链表合并成一个链表,并且保证合并的链表依然是有序的。
问题分析:
我们可以使用暴力合并的方法,就是不管有多少个链表,先让第一个链表和第二个链表进行合并,合并之后的结果在和第三个链表进行合并,依次进行下去直到把全部的链表全部合并成一个链表,这种方法是最简单最易想到的方法,但是时间复杂度太高了;还有一种方法是把所有链表中的节点值保存到一个数组中,然后对这个数组进行从小到大的排序,排序完成后再通过循环为每个节点值new成一个节点对象,最后再把节点节点串联起来,这样做相比暴力求解时间复杂度要低一些,但是依然不是最优的求解方法;最优的求解方法就是使用分治思想。
函数实现:
方法一(使用数组排序的方法求解多个有序链表的合并问题):
1 LinkedList<Integer> list = new LinkedList<>(); 2 // 循环遍历lists数组,把该数组中每一个链表中的每一个元素全部都存入list集合中 3 for (int i = 0; i < lists.length; i++) { 4 ListNode temp_Head = lists[i]; 5 while (temp_Head != null) { 6 list.add(temp_Head.val); 7 temp_Head = temp_Head.next; 8 } 9 } 10 //判断lists是否为空,如果为空则返回null,不在这里进行验证的话,Leetcode的边界检测不通过 11 if(list.size()==0){ 12 return null; 13 } 14 //将list转换为数组方便使用Arrays.sort()函数进行排序 15 Integer[] array_val = list.toArray(new Integer[0]); 16 Arrays.sort(array_val); 17 ListNode[] array = new ListNode[array_val.length]; 18 //将排序后的数组全部在生成对应的ListNode对象。此时的对象就已经是有序的 19 for (int i = 0; i < array_val.length; i++) { 20 array[i] = new ListNode(array_val[i]); 21 } 22 // 把ListNode[] array数组连接成一个链表 23 for (int i = 0; i < array.length - 1; i++) { 24 array[i].next = array[i + 1]; 25 } 26 return array[0]; 27 }
方法二(分治思想):
1 public ListNode mergeKLists(ListNode[] lists) { 2 if (lists.length == 0) { 3 return null; 4 } 5 if (lists.length == 1) { 6 return lists[0]; 7 } 8 if (lists.length == 2) { 9 return mergeTwoLists(lists[0], lists[1]); 10 } 11 int mid = lists.length / 2; 12 ListNode[] lists_sub1 = new ListNode[mid]; 13 ListNode[] lists_sub2 = new ListNode[lists.length - mid + 1]; 14 for(int i=0;i<mid;i++){ 15 lists_sub1[i]=lists[i]; 16 } 17 for(int i=mid;i<lists.length;i++){ 18 lists_sub2[i]=lists[i]; 19 } 20 ListNode l1=mergeKLists(lists_sub1); 21 ListNode l2=mergeKLists(lists_sub2); 22 return mergeTwoLists(l1,l2); 23 } 24 25 public ListNode mergeTwoLists(ListNode l1, ListNode l2) { 26 ListNode newHead = new ListNode(0); 27 ListNode temp_newHead = newHead; 28 while (l1 != null && l2 != null) { 29 if (l1.val < l2.val) { 30 temp_newHead.next = l1; 31 l1 = l1.next; 32 } else { 33 temp_newHead.next = l2; 34 l2 = l2.next; 35 } 36 temp_newHead = temp_newHead.next; 37 } 38 if (l1 != null) { 39 temp_newHead.next = l1; 40 } 41 if (l2 != null) { 42 temp_newHead.next = l2; 43 } 44 return newHead.next; 45 }
运行结果:
方法一的运行结果:
方法二的运行结果:
转载于:https://www.cnblogs.com/BaoZiY/p/10685178.html
K个排序链表的合并(Hard)相关推荐
- leetcode-23 合并K个排序链表
合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] 输出: 1->1-&g ...
- 刻意练习:LeetCode实战 -- Task12. 合并K个排序链表
背景 本篇图文是LSGO软件技术团队组织的 第二期基础算法(Leetcode)刻意练习训练营 的打卡任务.本期训练营采用分类别练习的模式,即选择了五个知识点(数组.链表.字符串.树.贪心算法),每个知 ...
- LeetCode实战:合并K个排序链表
题目英文 Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexi ...
- [leetcode-JavaScript]---23、合并K个排序链表
题目 合并 k 个排序链表,返回合并后的排序链表 示例: 输入:[1->4->5,1->3->4,2->6]输出: 1->1->2->3->4-& ...
- python排序链表_合并K个排序链表
合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入:[ 1->4->5, 1->3->4, 2->6 ]输出: 1->1-> ...
- 合并K个排序链表—leetcode23
合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] 输出: 1-&g ...
- 23. 合并K个排序链表
合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] 输出: 1-&g ...
- [剑指offer][JAVA]面试题[第23题][合并K个排序链表][分治][优先队列]
[问题描述]23.合并K个排序链表 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [1->4->5,1->3->4,2->6 ] ...
- LeetCode 23. 合并K个排序链表(优先队列)
文章目录 1. 题目信息 2. 思路 3. 代码 1. 题目信息 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例:输入: [1->4->5,1->3-& ...
- Leetcode--23.合并K个排序链表(Java)
合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] 输出: 1-&g ...
最新文章
- 基础数据结构【三】————老鼠走迷宫问题————堆栈应用
- 选哪扇门得奖金的算法
- python类_Python中的类
- 上海理工大学第二届“联想杯”全国程序设计邀请赛 - Experiment Class(几何+三分套三分)
- mysql根据经纬度搜周边_mysql根据经纬度获取附近的商家
- js传参不是数字_js调用函数时传入的参数个数与函数定义时的参数个数不符时的操作...
- thinkpad装linux无线网卡驱动,Thinkpad SL510 笔记本安装 Linux 无线网卡驱动
- AI产品,如何做好从零到一
- SqlServer Convert函数 日期格式化
- 领域驱动设计落地经验
- Origin | 比例弦图 (Chord Diagram) | 比例弦图与弦图的区别
- leggedrobotics free gait 足式机器人自由步态 苏黎世机器人系统实验室
- Floor报错注入原理解析心得
- html5 斜边,css斜切角 斜边 倒角
- 【深度学习】Pytorch实现CIFAR10图像分类任务测试集准确率达95%
- 11. 旋转数组的最小数字(剑指 Offer 题解Java版)
- C语言 typedef 关键字
- CSS计数器(序列数字字符自动递增)详解———张鑫旭
- Maven项目创建教程
- javascript运算符_返回基础:JavaScript运算符,条件和函数
热门文章
- SVN服务设置提交时备注文字长度
- 《Android游戏开发详解》一3.5 继承
- Nhibernate HQL 匿名类(严格说是map的使用以及构造函数的使用
- 创建模式--辛格尔顿
- 芒果 TV Redis 服务解决方案
- Tilemill + tilestream + mapbox.js 自制地图
- Linux yum安装unrar、rar
- 探索python--Robert J. Brunner
- 诗一首,程序员不仅仅只会写程序
- LINUX 下安装 jdk 问题(please use alien to install rpm packages on Debian )