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 ...
随机推荐
- Windows(7)上那些好用的软件及优化技巧(原创)
*本文为原创内容,转载请注明作者和出处:www.cnblogs.com/wang1024 软件篇 注:以下软件在百度直接搜索软件名均可找到官网,直接官网下载即可 大众的软件哪个好: 杀毒软件专题 基于 ...
- 160627、你想知道的关于JavaScript作用域的一切
JavaScript中有许多章节是关于scope的,但是对于初学者来说(甚至是一些有经验的JavaScript开发者),这些有关作用域的章节既不直接也不容易理解. 这篇文章的目的就是为了帮助那些想更深 ...
- Remoting在多IP多网卡内外网环境下的问题
Remoting服务器端如果服务器有多块网卡,多个IP地址的情况下会出现客户端callback失败的问题,debug以后发现客户端会callback到服务器端另外一个IP地址(例如外网地址,而不是内网 ...
- ubuntu14 编译安装(升级)g++
编译安装(升级)g++ ubuntu14自带的g++为4.8.4,不支持c++11.现要将g++升至5.2.0 1.下载安装: 参考https://www.cppfans.org/1719.html ...
- django--博客系统--后台管理
1.后台管理功能主要实现了,文章的添加与修改,以及富文本的使用 前端页面 母版 <!DOCTYPE html> <html lang="en"> <h ...
- Android图片加载框架Picasso最全使用教程3
前面我们对Picasso的用法有了一定得了解,下面就分析一下一些特殊情况下,Picasso的用法. 调用.noFade() Picasso的默认图片加载方式有一个淡入的效果,如果调用了noFade() ...
- C语言-随机数
C语言使用rand()函数产生随机数, 使用rand()函数之前要先使用srand(time(0)), 以当前时间作为种子, 否则产生的随机数将不会变化. #include <stdio.h&g ...
- PageObjects 设计模式
什么是Page Objects(翻译为:页面对象?)… 简单的说,Page Objects是指UI界面上用于与用户进行交互的对象.它可以指整个页面,也可以指Page上的某个区域.Page Object ...
- [转]c# 画图中bitmap类处理出图片时,存储的注意事项
今天查找以前写的画图程序,想完善一下,发现 图片添加文字水印时候会有些模糊,特别是小字体的时候特别模糊, 经过一番调适,终于发现了问题 帖上代码,警示自己 System.Drawing.Image i ...
- nfs服务、crond服务
一.nfs服务 NFS 是Network File System的缩写,即网络文件系统.一种使用于分散式文件系统的协定,由Sun公司开发,于1984年向外公布.功能是通过网络让不同的机器.不同的操作系 ...