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 ] 输出: ...
随机推荐
- Redis扩展机制
Redis扩展机制扫盲 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 关于Redis的Avalibility解决方案有很多,比如Twemproxy,Codis, 一.Twempro ...
- 重置sqlserver自增长列的种子
重置sqlserver自增长列的种子 转自:http://hi.baidu.com/zbphot/item/41c55982c2d02dd05e0ec184 如果表中的数据不要了,用下面的语句: t ...
- MongoDB实战性能优化
1. 性能优化分类 mongodb性能优化分为软件层面和操作系统层面. 软件层面,一般通过修改mongodb软件配置参数来达到,这个需要非常熟悉mongodb里面的各种配置参数: 而操作系统层面,相对 ...
- 使用C语言中qsort()函数对浮点型数组无法成功排序的问题
一 写在开头 1.1 本节内容 本节主要内容是有关C语言中qsort()函数的探讨. 二 问题和相应解决方法 qsort()是C标准库中的一个通用的排序函数.它既能对整型数据进行排序也能对浮点型数据进 ...
- ArcGis 属性表.dbf文件使用Excel打开中文乱码的解决方法
2019年4月 拓展: ArcGis——好好的属性表,咋就乱码了呢? 2019年3月27日补充: 在ArcMap10.3+(根据官网描述应该是,作者测试使用10.5,可行)以后的版本,可以使用ArcT ...
- [Everyday Mathematics]20150306
在王高雄等<常微分方程(第三版)>习题 2.5 第 1 题第 (32) 小题: $$\bex \frac{\rd y}{\rd x}+\frac{1+xy^3}{1+x^3y}=0. \e ...
- [物理学与PDEs]第3章习题2 仅受重力作用的定常不可压流理想流体沿流线的一个守恒量
设定常 (即 $\cfrac{\p {\bf u}}{\p t}={\bf 0}$).不可压缩 (设 $\rho=1$) 的理想流体所受的体积力仅为重力. 又设磁场满足条件: $({\bf H}\cd ...
- [物理学与PDEs]第1章习题15 媒介中电磁场的电磁动量密度向量与电磁动量流密度张量
对媒质中的电磁场, 推导其电磁动量密度向量及电磁动量流密度张量的表达式 (7. 47) 及 (7. 48). 解答: 由 $$\beex \bea \cfrac{\rd}{\rd t}\int_\Om ...
- tcp协议的简单理解
tpc协议属于传输层协议,本篇主要介绍下几个概念,以及握手和挥手的过程. 1.tcp的几个概念 位码:即tcp标志位,有6种提示 SYN:synchronus,表示建立联机. ACK:acknowle ...
- JAVA进阶9
间歇性混吃等死,持续性踌躇满志系列-------------第9天 1.使用throw语句抛出异常 在通常情况下,程序发生错误时系统会自动抛出异常,而有时希望程序自动抛出异常,可以使用throw语句来 ...