leetcode23 多个拍好序的链表进行归并排序 (java版本)
题目:
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版本)的更多相关文章
- 单向链表的归并排序——java实现
在做Coursera上的Algorithms第三周测验练习的时候有一道链表随机排序问题,刚开始没有什么思路,就想着先把单向链表归并排序实现了,再此基础上进行随机排序的改造.于是就结合归并排序算法,实现 ...
- 剑指Offer03 逆序输出链表&链表逆序
多写了个逆序链表 /************************************************************************* > File Name: ...
- 面试:用 Java 逆序打印链表
昨天的 Java 实现单例模式 中,我们的双重检验锁机制因为指令重排序问题而引入了 volatile 关键字,不少朋友问我,到底为啥要加 volatile 这个关键字呀,而它,到底又有什么神奇的作用呢 ...
- 剑指offer面试题5:逆序打印单链表(Java)
Java创建单链表(头插法.尾插法),并逆序打印单链表: package day_0324; import java.util.Scanner; import java.util.Stack; cla ...
- SDUT OJ 数据结构实验之链表二:逆序建立链表
数据结构实验之链表二:逆序建立链表 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descr ...
- SDUT-2117_数据结构实验之链表二:逆序建立链表
数据结构实验之链表二:逆序建立链表 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 输入整数个数N,再输入N个整数,按照 ...
- leetcode:Sort List(一个链表的归并排序)
Sort a linked list in O(n log n) time using constant space complexity. 分析:题目要求时间复杂度为O(nlogn),所以不能用qu ...
- C++:探究纯虚析构函数以及实现数组的高速排序与链表的归并排序
C++:探究纯虚析构函数以及实现数组的高速排序与链表的归并排序 标签: 数据结构 数组 链表 高速排序 归并排序 抽象类 虚继承 by 小威威 1.介绍 本篇博文将通过课后作业的(15 C++ Hom ...
- Java链表基本操作和Java.util.ArrayList
Java链表基本操作和Java.util.ArrayList 今天做了一道<剑指offer>上的一道编程题“从尾到头打印链表”,具体要求如下:输入一个链表,按链表值从尾到头的顺序返回一个A ...
随机推荐
- Class 实现IDisposing方法
public class MyResourceHog : IDisposable { // 已经被处理过的标记 private bool _alreadyDisposed = false; ...
- PHP实例练习--投票和租房子
一,调查问卷 效果图:
- JAVA函数的返回值类型详解以及生成随机数的例题
函数的四要素:函数名.输入.输出(返回).加工. 函数分为两种:一种是有返回值得函数,一种是没有返回值的函数. 1. 定义:没有返回值的函数:(当我不需要函数的计算结果再拿出来进行运算的时候,我就不需 ...
- Python中什么是set、更新、遍历set和set的特点
dict的作用是建立一组 key 和一组 value 的映射关系,dict的key是不能重复的. 有的时候,我们只想要 dict 的 key,不关心 key 对应的 value,目的就是保证这个集合的 ...
- 一个Delphi7的BUG
combobox有个属性DropDownCount可以控制显示的下拉数量, 但是 在Delphi7中, TCombobox或者任何从TCustomComboBox继承下来的类, 在windows7环境 ...
- 蓝牙BLE 架构剖析
一.BLE架构概述: 二.各个层
- Cocos2d-JS轻量级开发
官方提供了另外一种使用cocos2d js的方式,更适合web开发者,只要引用一个js就可以了 1.下载Cocos2d-JS Lite Version(去下载>>) 下载下来的将是一个完整 ...
- 1001 数组中和等于K的数对
1001 数组中和等于K的数对 基准时间限制:1 秒 空间限制:131072 KB 给出一个整数K和一个无序数组A,A的元素为N个互不相同的整数,找出数组A中所有和等于K的数对.例如K = 8,数组A ...
- Selenium2学习-032-WebUI自动化实战实例-030-JavaScript 在 Selenium 自动化中的应用实例之五(高亮标示元素)
在自动化脚本编写过程中,操作元素之前,需要对元素进行高亮显示(通过修改元素的边框样式),同时进行截图,以记录操作的元素对象.在实际应用中较为少见,通常用于演示,或者发生错误时的屏幕截图捕捉,用于错误报 ...
- Selenium2学习-020-WebUI自动化实战实例-018-获取浏览器窗口位置大小
在 UI 自动化测试过程中,每个机器上浏览器的默认大小.默认位置不尽相同,需要截图的时候,页面元素可能显示不完全,因而我们需要知道浏览器的宽度,或者直接在启动浏览器时,设置浏览器的宽度或位置(此文暂不 ...