K个排序链表的合并(Hard)
问题来源:选自leetCode 23:合并K个排序链表
问题描述:

题目给定信息:
不确定需要合并的链表的数目,但依然要求我们把给定的这些有序链表合并成一个链表,并且保证合并的链表依然是有序的。
问题分析:
我们可以使用暴力合并的方法,就是不管有多少个链表,先让第一个链表和第二个链表进行合并,合并之后的结果在和第三个链表进行合并,依次进行下去直到把全部的链表全部合并成一个链表,这种方法是最简单最易想到的方法,但是时间复杂度太高了;还有一种方法是把所有链表中的节点值保存到一个数组中,然后对这个数组进行从小到大的排序,排序完成后再通过循环为每个节点值new成一个节点对象,最后再把节点节点串联起来,这样做相比暴力求解时间复杂度要低一些,但是依然不是最优的求解方法;最优的求解方法就是使用分治思想。
函数实现:
方法一(使用数组排序的方法求解多个有序链表的合并问题):
LinkedList<Integer> list = new LinkedList<>();
// 循环遍历lists数组,把该数组中每一个链表中的每一个元素全部都存入list集合中
for (int i = 0; i < lists.length; i++) {
ListNode temp_Head = lists[i];
while (temp_Head != null) {
list.add(temp_Head.val);
temp_Head = temp_Head.next;
}
}
//判断lists是否为空,如果为空则返回null,不在这里进行验证的话,Leetcode的边界检测不通过
if(list.size()==0){
return null;
}
//将list转换为数组方便使用Arrays.sort()函数进行排序
Integer[] array_val = list.toArray(new Integer[0]);
Arrays.sort(array_val);
ListNode[] array = new ListNode[array_val.length];
//将排序后的数组全部在生成对应的ListNode对象。此时的对象就已经是有序的
for (int i = 0; i < array_val.length; i++) {
array[i] = new ListNode(array_val[i]);
}
// 把ListNode[] array数组连接成一个链表
for (int i = 0; i < array.length - 1; i++) {
array[i].next = array[i + 1];
}
return array[0];
}
方法二(分治思想):
public ListNode mergeKLists(ListNode[] lists) {
if (lists.length == 0) {
return null;
}
if (lists.length == 1) {
return lists[0];
}
if (lists.length == 2) {
return mergeTwoLists(lists[0], lists[1]);
}
int mid = lists.length / 2;
ListNode[] lists_sub1 = new ListNode[mid];
ListNode[] lists_sub2 = new ListNode[lists.length - mid + 1];
for(int i=0;i<mid;i++){
lists_sub1[i]=lists[i];
}
for(int i=mid;i<lists.length;i++){
lists_sub2[i]=lists[i];
}
ListNode l1=mergeKLists(lists_sub1);
ListNode l2=mergeKLists(lists_sub2);
return mergeTwoLists(l1,l2);
}
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode newHead = new ListNode(0);
ListNode temp_newHead = newHead;
while (l1 != null && l2 != null) {
if (l1.val < l2.val) {
temp_newHead.next = l1;
l1 = l1.next;
} else {
temp_newHead.next = l2;
l2 = l2.next;
}
temp_newHead = temp_newHead.next;
}
if (l1 != null) {
temp_newHead.next = l1;
}
if (l2 != null) {
temp_newHead.next = l2;
}
return newHead.next;
}
运行结果:
方法一的运行结果:

方法二的运行结果:


K个排序链表的合并(Hard)的更多相关文章
- [LeetCode] 23. 合并K个排序链表
题目链接: https://leetcode-cn.com/problems/merge-k-sorted-lists/ 题目描述: 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂 ...
- [Swift]LeetCode23. 合并K个排序链表 | Merge k Sorted Lists
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. E ...
- 合并K个排序链表
合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] 输出: 1-&g ...
- 合并K个排序链表(java实现)
题目: 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] 输出: ...
- 0008 合并K个排序链表
合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] 输出: 1-&g ...
- LeetCode(23):合并K个排序链表
Hard! 题目描述: 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [ 1->4->5, 1->3->4, 2-> ...
- LeetCode题解-23 合并K个排序链表 Hard
合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] 输出: 1->1-&g ...
- Leetcode题库——23.合并k个排序链表
@author: ZZQ @software: PyCharm @file: mergeKLists.py @time: 2018/10/12 19:55 说明:合并 k 个排序链表,返回合并后的排序 ...
- leetcode 23. 合并K个排序链表 JAVA
题目: 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] 输出: ...
随机推荐
- 使用AForge.NET Framework打开摄像头并截图 C#
videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice); if (videoDevices.Count == ...
- Hadoop记录- Yarn scheduler队列采集
#!/bin/sh ip=10.116.100.11 port=8088 export HADOOP_HOME=/app/hadoop/bin rmstate1=$($HADOOP_HOME/yarn ...
- IScroll某些手机下不触发ScrollEnd问题处理
同样是微信7.0,看起来内核都是x5内核,两款不同的手机,一个有问题,一个没有问题. IScroll在问题手机下会出现快速拨动时候不触发ScrollEnd事件现象,轻点一次才会触发,解决办法 docu ...
- Hibernate 4.3.11 下问题的解决
2017.01.09 问题:hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hib ...
- sublime 浏览器快捷键设置
之前每次忘掉在哪打开,这次认真记一下 菜单栏Preferences-->Package Settings-->Side Bar-->Key Binding-Users [ // ch ...
- RT-SA-2019-004 Cisco RV320 Unauthenticated Diagnostic DataRetrieval
Advisory: Cisco RV320 Unauthenticated Diagnostic Data Retrieval RedTeam Pentesting discovered that t ...
- python进制转化函数,10进制字符串互转,16进制字符串互转
来了老弟,emmmmm,今天想到平时经常用到编码转化,把字符串转化为16进制绕过等等的,今天想着用python写个玩,查询了一些资料,看了些bolg 上面的两个函数是将二进制流转化为16进制,data ...
- PHP 【二】
EOF EOF(heredoc)是一种在命令行shell(如sh.csh.ksh.bash.PowerShell和zsh)和程序语言(像Perl.PHP.Python和Ruby)里定义一个字符串的方法 ...
- L2-002 链表去重 (25 分) (模拟)
链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805072641245184 题目: 给定一个带整数键值的链表 L, ...
- 其他-pkuwc2019数学考试题目
时限150min,有windows和Ubuntu使用 十道填空题,在poj上举行,选手提交答案,系统将答案自动填入一个作用是输出答案的程序,再将该程序提交评测(由于该程序变量名为longlong,所以 ...