问题来源:选自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)的更多相关文章

  1. [LeetCode] 23. 合并K个排序链表

    题目链接: https://leetcode-cn.com/problems/merge-k-sorted-lists/ 题目描述: 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂 ...

  2. [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 ...

  3. 合并K个排序链表

    合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [   1->4->5,   1->3->4,   2->6 ] 输出: 1-&g ...

  4. 合并K个排序链表(java实现)

    题目: 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [   1->4->5,   1->3->4,   2->6 ] 输出: ...

  5. 0008 合并K个排序链表

    合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [   1->4->5,   1->3->4,   2->6 ] 输出: 1-&g ...

  6. LeetCode(23):合并K个排序链表

    Hard! 题目描述: 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [   1->4->5,   1->3->4,   2-> ...

  7. LeetCode题解-23 合并K个排序链表 Hard

    合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [ 1->4->5, 1->3->4, 2->6 ] 输出: 1->1-&g ...

  8. Leetcode题库——23.合并k个排序链表

    @author: ZZQ @software: PyCharm @file: mergeKLists.py @time: 2018/10/12 19:55 说明:合并 k 个排序链表,返回合并后的排序 ...

  9. leetcode 23. 合并K个排序链表 JAVA

    题目: 合并 k 个排序链表,返回合并后的排序链表.请分析和描述算法的复杂度. 示例: 输入: [   1->4->5,   1->3->4,   2->6 ] 输出: ...

随机推荐

  1. 学习Git过程中常用命令的总结

    复制远程库git clone git@github.com:Hconly/learngit.git在GitHub上,可以任意Fork开源仓库:自己拥有Fork后的仓库的读写权限:可以推送pull re ...

  2. Spotlight--你不得不用的Mac查询利器

    世界上有两种Mac用户:一种是经常使用Spotlight的,另一种是忽略Spotlight的.如果你是第二种用户,那么你需要改变.Mac所有方面的使用场景,都会随着Spotlight而变得更快.你只需 ...

  3. Pandas系列(四)-文本数据处理

    内容目录 1. 为什么要用str属性 2. 替换和分割 3. 提取子串 3.1 提取第一个匹配的子串 3.2 匹配所有子串 3.3 测试是否包含子串 3.4 生成哑变量 3.5 方法摘要 一.为什么要 ...

  4. mysql普通用户本机无法登录的解决办法

    背景 mysql和mariadb的用户表里存在匿名用户时,普通用户出现无法登录的情况 分析 先查看下用户表 mysql> select user, host, password from mys ...

  5. 关于缓存和 Chrome 的“新版刷新”

    在读本文前你要确保读过我的上篇文章<扼杀 304,Cache-Control: immutable>,因为本文是接着上文写的.上文说到,在现代 Web 上,“条件请求/304 响应”绝大多 ...

  6. 时间序列函数resamlpe详解

    resample与groupby的区别:resample:在给定的时间单位内重取样groupby:对给定的数据条目进行统计 函数原型:DataFrame.resample(rule, how=None ...

  7. codeblocks添加编译选项

    -std=c++0x

  8. canvas图片合成中的坑

    需求 要用代码来实现多张外部图片和文字的合并而且要上传到七牛云,再将图片链接通过客户端分享出去.图片背景需要支持用户自定义更换. 实现方案 在一个canvas上多次调用drawImage函数,分别绘制 ...

  9. Jmeter学习笔记03-元件作用域及执行顺序

    Jmeter可以通过鼠标拖拽来随意改变元件之间的顺序以及元件的层级关系,随着元件所在域的不同,在执行时候,会有不同效果 层级关系和元件类型决定了在测试计划中各元件的执行顺序. 1)元件的作用域: jm ...

  10. 动态代理和CGlib

    静态代理:静态代理的类也需要实现接口interface1,还要创建一个实现接口interface1的其他类class1,并且在静态代理类重写的方法中调用class1重写的方法.操作太多冗余.不好 动态 ...