题目:

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

思路1:

依次归并排序,首先归并前两个,然后归并完成的链表依次和剩下的链表进行归并排序

时间复杂度为O(m*n)

代码:

public static ListNode mergeKLists1(ListNode[] lists){
int len = lists.length;
if(len == 0){
return null;
}else{
if(len == 1){
return lists[0];
}else{
ListNode headl = new ListNode(-1);
ListNode head1 = lists[0], head2 = lists[1];
for(int i=0; i < len-1; i++){
if(head1 == null){
headl.next = head2;
}else{
if(head2 == null){
headl.next = head1;
}else{
//测量head1的链表长度
int len1 = 0;
ListNode ptr = head1;
while(ptr != null){
len1++;
ptr = ptr.next;
}

//测量head2的长度
int len2 = 0;
ptr = head2;
while(ptr != null){
len2++;
ptr = ptr.next;
}

ptr = headl;
ListNode ptr1 = head1, ptr2 = head2;
for(int j=0; j< len1+len2; j++){
if(ptr1 !=null && ptr2 != null){
if(ptr1.val <= ptr2.val){
ptr.next = ptr1;
ptr1 = ptr1.next;
ptr = ptr.next;
}else{
ptr.next = ptr2;
ptr2 = ptr2.next;
ptr = ptr.next;
}
}else{
if(ptr1 == null){
ptr.next = ptr2;
ptr2 = ptr2.next;
ptr = ptr.next;
}else{
ptr.next = ptr1;
ptr1 = ptr1.next;
ptr = ptr.next;
}
}
}
head1 = headl.next;
if(i+2 <= len-1){
head2 = lists[i+2];
}else{
break;
}
}//else(head1!=null && head2 != null)
}
} //for(int i=0; i < len-1; i++)
return headl.next;
}
}
}

思路2:

分治法

两两归并,递归调用即可。

因为每个链表都已经排序完成了,因此可以把链表数组看成一个待归并排序的数组,对之采用归并排序即可。

时间复杂度为O(n)

AC通过

代码:

public static ListNode mergeKLists(ListNode[] lists){
return mergeKLists(lists, 0, lists.length-1);
}

//分治法果然有效
public static ListNode mergeKLists(ListNode[] lists, int start, int end){
if(start == end){
return lists[start];
}
if(start > end){
return null;
}
int mid = (start + end)/2;
ListNode head1 = mergeKLists(lists, start, mid);
ListNode head2 = mergeKLists(lists, mid+1, end);
ListNode headl = new ListNode(-1);
ListNode ptr = headl;
while(head1 != null && head2 != null){
if(head1.val <= head2.val){
ptr.next = head1;
head1 = head1.next;
ptr = ptr.next;
}else{
ptr.next = head2;
head2 = head2.next;
ptr = ptr.next;
}
}

while(head1 != null){
ptr.next = head1;
head1 = head1.next;
ptr = ptr.next;
}

while(head2 != null){
ptr.next = head2;
head2 = head2.next;
ptr = ptr.next;
}

return headl.next;
}

leetcode23 多个拍好序的链表进行归并排序 (java版本)的更多相关文章

  1. 单向链表的归并排序——java实现

    在做Coursera上的Algorithms第三周测验练习的时候有一道链表随机排序问题,刚开始没有什么思路,就想着先把单向链表归并排序实现了,再此基础上进行随机排序的改造.于是就结合归并排序算法,实现 ...

  2. 剑指Offer03 逆序输出链表&链表逆序

    多写了个逆序链表 /************************************************************************* > File Name: ...

  3. 面试:用 Java 逆序打印链表

    昨天的 Java 实现单例模式 中,我们的双重检验锁机制因为指令重排序问题而引入了 volatile 关键字,不少朋友问我,到底为啥要加 volatile 这个关键字呀,而它,到底又有什么神奇的作用呢 ...

  4. 剑指offer面试题5:逆序打印单链表(Java)

    Java创建单链表(头插法.尾插法),并逆序打印单链表: package day_0324; import java.util.Scanner; import java.util.Stack; cla ...

  5. SDUT OJ 数据结构实验之链表二:逆序建立链表

    数据结构实验之链表二:逆序建立链表 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descr ...

  6. SDUT-2117_数据结构实验之链表二:逆序建立链表

    数据结构实验之链表二:逆序建立链表 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 输入整数个数N,再输入N个整数,按照 ...

  7. leetcode:Sort List(一个链表的归并排序)

    Sort a linked list in O(n log n) time using constant space complexity. 分析:题目要求时间复杂度为O(nlogn),所以不能用qu ...

  8. C++:探究纯虚析构函数以及实现数组的高速排序与链表的归并排序

    C++:探究纯虚析构函数以及实现数组的高速排序与链表的归并排序 标签: 数据结构 数组 链表 高速排序 归并排序 抽象类 虚继承 by 小威威 1.介绍 本篇博文将通过课后作业的(15 C++ Hom ...

  9. Java链表基本操作和Java.util.ArrayList

    Java链表基本操作和Java.util.ArrayList 今天做了一道<剑指offer>上的一道编程题“从尾到头打印链表”,具体要求如下:输入一个链表,按链表值从尾到头的顺序返回一个A ...

随机推荐

  1. 使用 Linux 搭建 VPN

    http://blog.csdn.net/catoop/article/details/7537012 VPN服务器的配置与应用 实验场景 通过将Linux配置VPN服务器允许远程计算机能够访问内网. ...

  2. shell执行mysql操作

    http://ully.iteye.com/blog/1226494 http://www.jb51.net/article/55207.htm shell执行mysql操作 mysql  -hhos ...

  3. Solr4.3之拼写检查Spellcheck功能

    原文地址:http://www.656463.com/article/iaquii.htm 拼写检查功能,能在搜索时提供一个较好用户体验,所以,主流的搜索引擎都有这个功能,在这之前,笔者先简单的说一下 ...

  4. 使用dotTrace6.0进行内存分析

    dotTrace6.0提供了内存分析功能,统计抓取的时间段内各个堆栈执行过程中使用的内存大小,按照堆栈执行情况树状排序:和它之前提供的时间统计类似,粗截了几个页面,希望对大家有所帮助. 下载安装Jet ...

  5. angularJS推荐显示注入写法

    使用js压缩工具时发现压缩之后的控制器注入参数由原来的$scope变成了a,b...这样的字母而导致js失效,那么我们推荐使用完整的显示注入方式来解决此问题! //隐式注入的写法 angular.mo ...

  6. 位与(&)常用编程技巧

    补充知识:1)正整数的补码与原码相同:                2)求负整数的补码:原码 符号位不变,数值位各位取反,最后整个数加1得到补码:                3)按位与& ...

  7. ArcGIS API for Silverlight实现地图测距功能

    原文:ArcGIS API for Silverlight实现地图测距功能 问题:如何实现地图测距功能? 地图工具栏 <Grid x:Name="gToolMenu" Hei ...

  8. 图解SSL/TLS协议

    本周,CloudFlare宣布,开始提供Keyless服务,即你把网站放到它们的CDN上,不用提供自己的私钥,也能使用SSL加密链接. 我看了CloudFlare的说明(这里和这里),突然意识到这是绝 ...

  9. [LeetCode]题解(python):090 Subsets II

    题目来源 https://leetcode.com/problems/subsets-ii/ Given a collection of integers that might contain dup ...

  10. I Count Two Three---hdu5878(打表+二分)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5878 题意:找到第一个>=n的数x, 满足 x = 2a3b5c7d:n<=1e9; 打表 ...