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 ] 输出: ...
随机推荐
- 学习Git过程中常用命令的总结
复制远程库git clone git@github.com:Hconly/learngit.git在GitHub上,可以任意Fork开源仓库:自己拥有Fork后的仓库的读写权限:可以推送pull re ...
- Spotlight--你不得不用的Mac查询利器
世界上有两种Mac用户:一种是经常使用Spotlight的,另一种是忽略Spotlight的.如果你是第二种用户,那么你需要改变.Mac所有方面的使用场景,都会随着Spotlight而变得更快.你只需 ...
- Pandas系列(四)-文本数据处理
内容目录 1. 为什么要用str属性 2. 替换和分割 3. 提取子串 3.1 提取第一个匹配的子串 3.2 匹配所有子串 3.3 测试是否包含子串 3.4 生成哑变量 3.5 方法摘要 一.为什么要 ...
- mysql普通用户本机无法登录的解决办法
背景 mysql和mariadb的用户表里存在匿名用户时,普通用户出现无法登录的情况 分析 先查看下用户表 mysql> select user, host, password from mys ...
- 关于缓存和 Chrome 的“新版刷新”
在读本文前你要确保读过我的上篇文章<扼杀 304,Cache-Control: immutable>,因为本文是接着上文写的.上文说到,在现代 Web 上,“条件请求/304 响应”绝大多 ...
- 时间序列函数resamlpe详解
resample与groupby的区别:resample:在给定的时间单位内重取样groupby:对给定的数据条目进行统计 函数原型:DataFrame.resample(rule, how=None ...
- codeblocks添加编译选项
-std=c++0x
- canvas图片合成中的坑
需求 要用代码来实现多张外部图片和文字的合并而且要上传到七牛云,再将图片链接通过客户端分享出去.图片背景需要支持用户自定义更换. 实现方案 在一个canvas上多次调用drawImage函数,分别绘制 ...
- Jmeter学习笔记03-元件作用域及执行顺序
Jmeter可以通过鼠标拖拽来随意改变元件之间的顺序以及元件的层级关系,随着元件所在域的不同,在执行时候,会有不同效果 层级关系和元件类型决定了在测试计划中各元件的执行顺序. 1)元件的作用域: jm ...
- 动态代理和CGlib
静态代理:静态代理的类也需要实现接口interface1,还要创建一个实现接口interface1的其他类class1,并且在静态代理类重写的方法中调用class1重写的方法.操作太多冗余.不好 动态 ...