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. Spring MVC 多语言化的实践和学习

    一.主要参考: SpringMVC简单实现国际化/多语言 - CSDN博客 https://blog.csdn.net/u013360850/article/details/70860144/ 二.总 ...

  2. Refused to execute script from '....js' because its MIME type ('text/html') is not executable, and strict MIME type checking is enabled.md

    目录 问题描述 解决过程 总结 问题描述 在整合 Spring Boot.Spring Security.Thymeleaf 的练习中,对页面进行调试时,发现如下错误提示: Refused to ex ...

  3. openssl update--centos 6.5

    cd /usr/local/src #wget http://www.openssl.org/source/openssl-1.0.1h.tar.gz #tar -zxvf openssl-1.0.1 ...

  4. jq封装选项卡写法

    jq普通选项卡写法: var tabTag=$('#tabon'); var tabon=tabTag.find('li');//菜单栏 var tabCon=$(".hidden" ...

  5. 剑指Offer——用两个栈实现队列

    题目描述: 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 分析: 代码: class Solution { public: void push(int node ...

  6. 我的Android进阶之旅------>解决:Execution failed for task ':app:transformResourcesWithMergeJavaResForDebug'.

    错误描述 今天在Android Studio项目中加入了jackson的开发包,编译运行时候,引发了如下的错误: Error:Execution failed for task ':app:trans ...

  7. Android ViewGroup onInterceptTouchEvent

    public boolean onInterceptTouchEvent (MotionEvent ev) Implement this method to intercept all touch s ...

  8. 009-JDK可视化监控工具-JConsole

    Console工具在JDK/bin目录下,启动JConsole后,将自动搜索本机运行的jvm进程,不需要jps命令来查询指定.双击其中一个jvm进程即可开始监控,也可使用“远程进程”来连接远程服务器. ...

  9. App doesn't auto-start an app when booting the device in Android

    From Android 3.1, newly installed apps are always put into a "stopped" state and the only ...

  10. corethink功能模块探索开发(十六)后台搜索功能

    效果图: 代码很简单,就是添加搜索框,搜索字段,在初始化页面查询的时候添加查询条件. 1.添加搜索框 添加到删除按钮后边. ->setSearch('请输入设备名称/MAC/宿舍号', U('i ...