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路归并的更多相关文章

  1. 【LeetCode】【数组归并】Merge k Sorted Lists

    描述 Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity ...

  2. 刷题23. Merge k Sorted Lists

    一.题目说明 这个题目是23. Merge k Sorted Lists,归并k个有序列表生成一个列表.难度为Hard,实际上并不难,我一次提交就对了. 二.我的解答 就是k路归并,思路很简单,实现也 ...

  3. Merge k Sorted Lists

    1. Merge Two Sorted Lists 我们先来看这个 问题: Merge two sorted linked lists and return it as a new list. The ...

  4. 【LeetCode练习题】Merge k Sorted Lists

    Merge k Sorted Lists Merge k sorted linked lists and return it as one sorted list. Analyze and descr ...

  5. 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 ...

  6. [LeetCode] Merge k Sorted Lists 合并k个有序链表

    Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 这 ...

  7. No.023:Merge k Sorted Lists

    问题: Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexit ...

  8. 71. Merge k Sorted Lists

    Merge k Sorted Lists Merge k sorted linked lists and return it as one sorted list. Analyze and descr ...

  9. 【leetcode】Merge k Sorted Lists

    Merge k Sorted Lists Merge k sorted linked lists and return it as one sorted list. Analyze and descr ...

随机推荐

  1. xmpp muc 群聊协议 4

    7. Occupant Use Cases The main actor in a multi-user chat environment is the occupant, who can be sa ...

  2. selenium调用Firefox和Chrome需要注意的一些问题,和出现的报错selenium:expected [object undefined] undefined to be a string

    在高版本selenium下如:selenium3.4.3 1.高版本的selenium需要浏览器安装一些补丁驱动 Firefox:geckodriver 下载网址:http://download.cs ...

  3. node.js开发学习一HelloWorld

    前言:由于公司业务需求,最近启动了node.js的开发任务,想把自己的开发学习历程记录记录下来,可以增加记忆,也方便查找.虽然对javascript有一定的了解,但是刚接触node.js的时候,发现还 ...

  4. Exchange Version and UpdateRollups

    Exchange Server 2010 Product name Build number Date KB Microsoft Exchange Server 2010 RTM 14.0.639.2 ...

  5. decode-encode --其他使用可能有问题

    SELECT id,DECODE(name,'password') FROM test UPDATE test SET `name`=ENCODE(`name`,'password')

  6. 视频流协议HLS与RTMP 直播原理 点播原理

    小结: 1.HLS原理 视频--->图像.声音分别编码打包切割容器文件ts,建立纯文本索引文件.m3u8--->播放器http下载容器文件.索引文件,播放,下载 基于HLS可以实现直播和点 ...

  7. AttachThreadInput

    BOOL WINAPI AttachThreadInput( _In_  DWORD idAttach, _In_  DWORD idAttachTo, _In_  BOOL fAttach ); i ...

  8. Web页面性能优化(YSlow)

    YSlow(解析为Why Slow)是雅虎基于网站优化规则推出的工具,帮助你分析并优化网站性能.旧版Yslow 有13条规则,新版Yslow有23项规则,YSlow会根据这些规则分析你的网站,并给出评 ...

  9. iMessenger 2.0.14.0801简述

    有些梦,看似遥不可及.但并非不能实现,仅仅要你足够的强!!.人力有时而穷,所以我们可能还须要一些热心人的帮助.这个人可能就是你. 四年来,我们一直在努力,从未放弃. 在我们做好一件事之前.我们永远不知 ...

  10. NUnit.Framework的使用方法演示

    using NUnit.Framework; namespace CheckExcel { [TestFixture] public class TestExcelHelper { /// <s ...