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(给链表排序)的更多相关文章

  1. 9. Sort List && Insertion Sort List (链表排序总结)

    Sort List Sort a linked list in O(n log n) time using constant space complexity.                   H ...

  2. 45.Sort List(链表排序)

    Level:   Medium 题目描述: Sort a linked list in O(n log n) time using constant space complexity. Example ...

  3. 148. Sort List (java 给单链表排序)

    题目:Sort a linked list in O(n log n) time using constant space complexity. 分析:给单链表排序,要求时间复杂度是O(nlogn) ...

  4. 给乱序的链表排序 · Sort List, 链表重排reorder list LoLn...

    链表排序 · Sort List [抄题]: [思维问题]: [一句话思路]: [输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入): [画图]: quick ...

  5. C语言 链表的使用(链表的增删查改,链表逆转,链表排序)

    //链表的使用 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include< ...

  6. c语言:链表排序, 链表反转

    下面将实现链表排序的排序和遍历显示功能: 所定义的链表结构如下: head -> p1 -> p2 ->p3 ->....->pn; head的本身不作为数据节点,hea ...

  7. Leetcode:148_Sort List | O(nlogn)链表排序 | Medium

    题目:Sort List Sort a linked list in O(n log n) time using constant space complexity 看题目有两个要求:1)时间复杂度为 ...

  8. 算法基础~链表~排序链表的合并(k条)

    算法基础~链表~排序链表的合并(k条) 1,题意:已知k个已排序链表头结点指针,将这k个链表合并,合并后仍然为有序的,返回合并后的头结点. 2,方法之间时间复杂度的比较: 方法1(借助工具vector ...

  9. 定制对ArrayList的sort方法的自定义排序

    java中的ArrayList需要通过collections类的sort方法来进行排序 如果想自定义排序方式则需要有类来实现Comparator接口并重写compare方法 调用sort方法时将Arr ...

随机推荐

  1. Java正则表达式小记

    http://blog.csdn.net/pipisorry/article/details/51059500 正则表达式的一般规则都一样,见[python正则表达式] java正则表达式中的特殊字符 ...

  2. Android4.4.2KK竖屏强制更改为横屏的初步简略方案

    点击打开链接 解决方案: 当前是根据当前问题场景即竖屏强制更改为横屏的需求而做的改动,基本是hardcode定义的状态,总共修改有效代码行数5行,如果后续有其他需求或者需要更灵活的配置横屏和竖屏,可以 ...

  3. Common Bit Tasks

    1) If you XOR a bit with its own negated value, you will always get 1. Therefore thesolution to a ^ ...

  4. 精通CSS+DIV网页样式与布局--初探CSS

    CSS英文名Cascading Style Sheet,中文名字叫层叠样式表,是用于控制页面样式并允许将样式信息与网页内容分离的一种标记性语言,DIV+CSS是WEB设计标准,它是一种网页的布局方法. ...

  5. 【算法导论】第i小的元素

    第i小的元素       时间复杂度:O(n). 基本思想:和快速排序的思想相似,也是对数组进行递归划分,但是有所差别的是,快速排序会递归处理划分的两边,而随机化的选择算法只选择一边.       具 ...

  6. Cocos2D旋转炮塔到指定角度(二)

    增加如下代码到ccTouchesEnded方法中,就在你在导弹精灵上调用runAction之前: // Determine angle to face float angleRadians = ata ...

  7. 尚学堂马士兵struts2 课堂笔记(三)

    19-20 简单数据验证 例如 前台jsp 及struts.xml <a href="user/user!add?name=a" >添加用户</a> < ...

  8. 【一天一道LeetCode】#130. Surrounded Regions

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...

  9. 【转载】2015 Objective-C 三大新特性 | 干货

    Overview 自 WWDC 2015 推出和开源 Swift 2.0 后,大家对 Swift 的热情又一次高涨起来,在羡慕创业公司的朋友们大谈 Swift 新特性的同时,也有很多像我一样工作上依然 ...

  10. OC中的类别Category-协议Protocol-…

    类别(category)--通过使用类别,我们可以动态地为现有的类添加新方法,而且可以将类定义模块化地分不到多个相关文件中.通常只在类别中定义方法. 类别,接口部分的定义,通常该文件命名为已有&quo ...