Merge k Sorted Lists, k路归并
import java.util.Arrays;
import java.util.List;
import java.util.PriorityQueue;
/*
class ListNode
{
ListNode next;
int val;
ListNode(int x)
{
val = x;
}
}
*/
//k路归并问题
public class MergKSortedLists { //二路归并,这个算法时间复杂度o(2n)
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode dumy = new ListNode(0);
ListNode head = dumy;
while (l1 != null && l2 != null) {
if (l1.val < l2.val) {
dumy.next = l1;
l1 = l1.next;
} else {
dumy.next = l2;
l2 = l2.next;
}
dumy = dumy.next;
}
if (l1 == null) {
dumy.next = l2;
}
if (l2 == null) {
dumy.next = l1;
}
return head.next;
}
//利用二路归并进行k路归并,时间复杂度o(2kn),leetcode显示time limits exceeds
public ListNode mergeKLists1(ListNode[] lists)
{
if(lists.length == 0)
{
return null;
}
ListNode head = lists[0];
for(int i = 1; i < lists.length; i ++)
{
head = mergeTwoLists(head, lists[i]);
}
return head;
} //网上看到的很有意思的想法。就把ListNode当做一个整数,这道题,正好看做数组的二路归并排序,不过数组里面的元素是节点
//这种方法显然也是超时的,这种思想,看似是二路归并,其实并不是,粒度不一样。这个算法的时间复杂度也并不是O(nlgn)
public ListNode mergerKlists2(ListNode[] lists)
{
//自顶向下的二路归并,递归
if(lists.length == 0)
{
return null;
}
List<ListNode> a = Arrays.asList(lists);
return helper(a);
}
public ListNode helper(List<ListNode> lists)
{
if(lists.size() == 1)
{
return lists.get(0);
}
int len = lists.size();
int mid = len/2;
ListNode l1 = helper(lists.subList(0, mid));
ListNode l2 = helper(lists.subList(mid, len));
return mergeTwoLists(l1, l2);
} //利用PriorityQueue的特性,也很巧妙,并且AC
//算法思想是:比较所有k个数组的头一个元素,找到最小的那一个,然后取出来。
//我们在该最小元素所在的数组取下一个元素,然后重复前面的过程去找最小的那个。这样依次循环直到找到所有的元素。
public ListNode mergeKLists3(ListNode[] lists)
{
if(lists.length == 0)
return null;
//由于ListNode并没有实现comparable接口,我们必须自定义排序规则,可实现comparator接口,comparator是函数式接口
//comparable接口是在方法内的,而comparator接口是在方法外的注意区别两者
PriorityQueue<ListNode> queue = new PriorityQueue<>((o1, o2)->
{
ListNode l1 = (ListNode)o1;
ListNode l2 = (ListNode)o2;
return l1.val > l2.val ? 1 : l1.val < l2.val ? -1 : 0;
});
ListNode head = new ListNode(0);
ListNode p = head;
for (ListNode list : lists) {
queue.offer(list);
}
while(!queue.isEmpty())
{
ListNode n = queue.poll();
p.next = n;
p = p.next;
if(n.next!=null)
{
queue.offer(n.next);
}
}
return head.next;
}
}
堆排序算法后续补充。。。。
Merge k Sorted Lists, k路归并的更多相关文章
- 【LeetCode】【数组归并】Merge k Sorted Lists
描述 Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity ...
- 刷题23. Merge k Sorted Lists
一.题目说明 这个题目是23. Merge k Sorted Lists,归并k个有序列表生成一个列表.难度为Hard,实际上并不难,我一次提交就对了. 二.我的解答 就是k路归并,思路很简单,实现也 ...
- Merge k Sorted Lists
1. Merge Two Sorted Lists 我们先来看这个 问题: Merge two sorted linked lists and return it as a new list. The ...
- 【LeetCode练习题】Merge k Sorted Lists
Merge k Sorted Lists Merge k sorted linked lists and return it as one sorted list. Analyze and descr ...
- Leetcode 23.Merge Two Sorted Lists Merge K Sorted Lists
Merge Two Sorted Lists Merge two sorted linked lists and return it as a new list. The new list shoul ...
- [LeetCode] Merge k Sorted Lists 合并k个有序链表
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 这 ...
- No.023:Merge k Sorted Lists
问题: Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexit ...
- 71. Merge k Sorted Lists
Merge k Sorted Lists Merge k sorted linked lists and return it as one sorted list. Analyze and descr ...
- 【leetcode】Merge k Sorted Lists
Merge k Sorted Lists Merge k sorted linked lists and return it as one sorted list. Analyze and descr ...
随机推荐
- nvm-windows 手动安装 nvm use 无效 'node' 不是内部或外部命令,也不是可运行的程序
按照这两位前辈的教程,安装了nvm-windows. http://www.cnblogs.com/yesyes/p/7403184.html http://blog.csdn.net/jingsi1 ...
- 170110、Spring 事物机制总结
spring两种事物处理机制,一是声明式事物,二是编程式事物 声明式事物 1)Spring的声明式事务管理在底层是建立在AOP的基础之上的.其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加 ...
- pc端和移动端的区别
以下都是自己的个人理解,说错了希望大家多交流交流.1,普通pc端开发与移动端开发区别.普通pc端开发,我理解就是你拿电脑打开的网页都算[这相信大部分人都知道].那么移动端开发工程师,说白了就很好理解了 ...
- Oracle http://127.0.0.1:8080/apex无法访问解决方案
造成无法访问的原因多数情况是由于Oracle中TNS的配置发生了改变. 造成TNS配置有问题的原因可能是:1. 修改了计算机名 2. 修改了IP 默认oracleXE 启动OracleXETNS ...
- MySQL小记
一.MyISAM和InnoDB MyISAM引擎是不支持事务的,所以一般开发Mysql的引擎使用InnoDB. 事务处理上方面: MyISAM类型的表强调的是性能,其执行速度比InnoDB类型更快,但 ...
- php smarty模板引擎
<?php /* 一.什么是smarty? smarty是一个使用PHP写出来的模板PHP模板引擎,它提供了逻辑与外在内容的分离,简单的讲, 目的就是要使用PHP程序员同美工分离,使用的程序员改 ...
- DRF(1) - REST、DRF(View源码解读、APIView源码解读)
一.REST 1.什么是编程? 数据结构和算法的结合. 2.什么是REST? 首先回顾我们曾经做过的图书管理系统,我们是这样设计url的,如下: /books/ /get_all_books/ 访问所 ...
- Nginx+Springboot+Vue 前后端分离 解决跨域问题
1:前端vue 写完 打包 npm run build prod 2: 后端api 写完打包 springboot mvn package -Dmaven.test.skip=true 3: ngin ...
- python数据类型及其操作
一.数字 常用类型:int,float age = 10 # int型 salary = 3000.5 # float型 进制: 二进制: 11 = 1*21 + 1*20 = 3 八进制: 11 ...
- LeetCode:二叉树的前序遍历【144】
LeetCode:二叉树的前序遍历[144] 题目描述 给定一个二叉树,返回它的 前序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,2,3] 题目分析 如果用递 ...