sort list(给链表排序)
Sort a linked list in O(n log n) time using constant space complexity.
题目要求使用O(nlogn)时间复杂度,可以考虑使用归并排序,在 merge two sorted lists 中,已经知道了将两个有序链表进行合并。这里只要在这基础上修改。
排序算法入门之归并排序(java实现) 说了数组的归并排序,
使用归并排序。每次要找到中间元素进行前后的排序,然后进行合并。
    合并时,数组是使用一个额外的空数组,因为使用一个数组要用到插入,数组操作插入不方便。
    对于链表合并,可以使用一个额外的链表。也可以不使用额外链表,使用两个合并链表中的一个,将合并后元素都放到该链表中,因为链表操作插入方便。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
/**
使用归并排序。每次要找到中间元素进行前后的排序,然后进行合并。
合并时,数组是使用一个额外的空数组,因为使用一个数组要用到插入,数组操作插入不方便。
对于链表合并,可以使用一个额外的链表。也可以不使用额外链表,使用两个合并链表中的一个,将合并后元素都放到该链表中,因为链表操作插入方便。
*/
public ListNode sortList(ListNode head) {
return mergeSort(head);
}
public ListNode mergeSort(ListNode head){
if(head==null||head.next==null) return head;
//找到中间节点,然后将链表断开,分成两个链表
ListNode slow=head;
ListNode fast=head;
while(fast.next!=null&&fast.next.next!=null){
slow=slow.next;
fast=fast.next.next;
}
//将链表断开,分成两个
ListNode head2=slow.next;
slow.next=null;//断开
ListNode head1=head;
head1=mergeSort(head1);
head2=mergeSort(head2);
return merge(head1,head2); }
//这里合并时,不使用额外的链表,使用l1作为保存结果,但是因为l1的第一个元素可能会发生改变,所以新建一个节点
public ListNode merge(ListNode l1,ListNode l2){
ListNode helper=new ListNode(0);
helper.next=l1;
ListNode pre=helper;//指向l1节点的前一个节点,用于插入节点到l1前面
while(l1!=null&&l2!=null){
if(l1.val<l2.val){
l1=l1.next;
}else{
ListNode next=l2.next;
l2.next=l1;
pre.next=l2;
l2=next; }
pre=pre.next;
}
while(l2!=null){
pre.next=l2;
pre=pre.next;
l2=l2.next;
}
return helper.next;
}
}
sort list(给链表排序)的更多相关文章
- 9. Sort List  &&  Insertion Sort List (链表排序总结)
		
Sort List Sort a linked list in O(n log n) time using constant space complexity. H ...
 - 45.Sort List(链表排序)
		
Level: Medium 题目描述: Sort a linked list in O(n log n) time using constant space complexity. Example ...
 - 148. Sort List (java 给单链表排序)
		
题目:Sort a linked list in O(n log n) time using constant space complexity. 分析:给单链表排序,要求时间复杂度是O(nlogn) ...
 - 给乱序的链表排序 · Sort List, 链表重排reorder list LoLn...
		
链表排序 · Sort List [抄题]: [思维问题]: [一句话思路]: [输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入): [画图]: quick ...
 - C语言 链表的使用(链表的增删查改,链表逆转,链表排序)
		
//链表的使用 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include< ...
 - c语言:链表排序, 链表反转
		
下面将实现链表排序的排序和遍历显示功能: 所定义的链表结构如下: head -> p1 -> p2 ->p3 ->....->pn; head的本身不作为数据节点,hea ...
 - Leetcode:148_Sort List | O(nlogn)链表排序 | Medium
		
题目:Sort List Sort a linked list in O(n log n) time using constant space complexity 看题目有两个要求:1)时间复杂度为 ...
 - 算法基础~链表~排序链表的合并(k条)
		
算法基础~链表~排序链表的合并(k条) 1,题意:已知k个已排序链表头结点指针,将这k个链表合并,合并后仍然为有序的,返回合并后的头结点. 2,方法之间时间复杂度的比较: 方法1(借助工具vector ...
 - 定制对ArrayList的sort方法的自定义排序
		
java中的ArrayList需要通过collections类的sort方法来进行排序 如果想自定义排序方式则需要有类来实现Comparator接口并重写compare方法 调用sort方法时将Arr ...
 
随机推荐
- 编译GDAL使用最新的HDF库配置文件
			
HDF库最新版本中的动态库以及目录结构都发生了变化,导致按照之前的博客进行编译GDAL时,会出问题.使用HDF4版本为HDF4-4.2.10,HDF5的版本为HDF5-1.8.12.两个库的目录结构如 ...
 - Java正则表达式小记
			
http://blog.csdn.net/pipisorry/article/details/51059500 正则表达式的一般规则都一样,见[python正则表达式] java正则表达式中的特殊字符 ...
 - iOS中 UIWebView加载网络数据 技术分享
			
直奔核心: #import "TechnologyDetailViewController.h" #define kScreenWidth [UIScreen mainScreen ...
 - 使用批处理文件(*.bat)同时打多个cmd窗口
			
使用批处理文件(*.bat)同时打多个cmd窗口 最近在研究zookeeper,在本地建了几个目录,发现频繁的去各个目录启动zkServer.cmd十分繁琐,于是乎google,才有了下文: 使用批处 ...
 - PA模块常用表
			
SELECT * FROM pa_projects_all; --项目 SELECT * FROM pa_project_types; --项目类型 SELECT * FROM pa_project_ ...
 - shell快捷键
			
方向 <-前 后-> 删除 ctrl + d 删除光标所在位置上的字符相当于VIM里x或者dl ctrl + h 删除光标 ...
 - 【一天一道LeetCode】#68. Text Justification
			
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...
 - (三十七)从私人通讯录引出的细节I -Notification -Segue -HUD -延时
			
细节1:账号和密码都有值的时候才可以点击登录按钮,因此应该监听文本框的文本改变. 因为文本框的文本改变代理不能处理,因此应该使用通知Notification. 文本框文本改变会发出通知:通知的前两个参 ...
 - Linux--缺页中断和交换技术
			
1.请求调页中断:进程线性地址空间里的页面不必常驻内存,例如进程的分配请求被理解满足,空间仅仅保留vm_area_struct的空间,页面可能被交换到后援存储器,或者写一个只读页面(COW).Linu ...
 - ViewPager适配器学习记录( pageAdapter和FragmentPagerAdapter/FragmentStatePagerAdapter))
			
1.概述 ViewPager,顾名思义实现控件的滚动功能,是Support-v4的包中类,使用前要先导包.使用的时候跟listView有点相似,需要设置对应的适配器,通常有俩大类 [pageAdapt ...