题目:Sort a linked list inO(n log n) time using constant space complexity.

题意及分析:要求使用o(nlogn)的时间复杂度和o(1)的空间复杂度将链表排序。o(nlogn)的排序算法有快速排序,归并排序和堆排序。但是快速排序最差情况下时间复杂度为o(n^2),所以不考虑,堆排序比较复杂,因此我这里使用归并排序。对于一个数组来说,归并排序主要是讲数组从中间分割成两部分,然后对左右子数组做同样操作,直至每个子数组都只有一个元素,然后两两合并。因为这里是链表,所以怎么找到中间分割点比较关键,这里使用两个指针slow,fast,slow每次移动一步,fast每次移动两步,当fast到链表尾时,slow所在位置就是链表中。我这里使用的是递归的方法求解。对于链表来说,非递归算法效率更高,所以合并处可以使用非递归算法,这样会快很多。

代码:

递归:

/**

* Definition for singly-linked list.

* public class ListNode {

* int val;

* ListNode next;

* ListNode(int x) { val = x; }

* }

*/

public class Solution {

public ListNode sortList(ListNode head) {

if(head==null||head.next==null) return head;

ListNode slow=head;

ListNode fast=head;

ListNode p=head;

while(fast!=null&&fast.next!=null){//slow每次走一步,fast每次走两步,当fast走到最后时,slow走到链表的中间,这样就可以将链表分成两半

p=slow;

slow=slow.next;

fast=fast.next.next;

}

p.next=null;//将前半段链表设置为null结尾,这样链表就被分成(head,p),(slow,fast)

ListNode h1=sortList(head);

ListNode h2=sortList(slow);

return mergeList(h1, h2);

}

public ListNode mergeList(ListNode h1,ListNode h2){//合并两个链表

if(h1==null) return h2;

if(h2==null) return h1;

if(h1.val

h1.next=mergeList(h1.next, h2);

return h1;

}else{

h2.next=mergeList(h1, h2.next);

return h2;

}

}

}

非递归:

/**

* Definition for singly-linked list.

* public class ListNode {

* int val;

* ListNode next;

* ListNode(int x) { val = x; }

* }

*/

public class Solution {

public ListNode sortList(ListNode head) {

if(head==null||head.next==null) return head;

ListNode slow=head;

ListNode fast=head;

ListNode p=head;

while(fast!=null&&fast.next!=null){//slow每次走一步,fast每次走两步,当fast走到最后时,slow走到链表的中间,这样就可以将链表分成两半

p=slow;

slow=slow.next;

fast=fast.next.next;

}

p.next=null;//将前半段链表设置为null结尾,这样链表就被分成(head,p),(slow,fast)

ListNode h1=sortList(head);

ListNode h2=sortList(slow);

return mergeList(h1, h2);

}

public ListNode mergeList(ListNode h1,ListNode h2){//合并两个链表

if(h1==null) return h2;

if(h2==null) return h1;

ListNode res = new ListNode(0);//结果链表

ListNode x=res;

while(h1!=null&&h2!=null){

if(h1.val

x.next=h1;

h1=h1.next;

x=x.next;

}else{

x.next=h2;

h2=h2.next;

x=x.next;

}

}

if(h1!=null)

x.next=h1;

if(h2!=null)

x.next=h2;

return res.next;

}

}

sort list java leetcode_[LeetCode] 148. Sort List Java相关推荐

  1. LeetCode 148. Sort List--面试算法题--C++,Python解法

    LeetCode 148. Sort List–面试算法题–C++,Python解法 LeetCode题解专栏:LeetCode题解 LeetCode 所有题目总结:LeetCode 所有题目总结 大 ...

  2. 【归并排序+递归】LeetCode 148. Sort List

    LeetCode 148. Sort List Solution1:我的答案 很多递归 /*** Definition for singly-linked list.* struct ListNode ...

  3. leetcode 148. Sort List | 148. 排序链表(最优解归并排序,O(1)空间)

    题目 https://leetcode.com/problems/sort-list/ 题解 分析 就链表排序问题来说,它的解法可以有好多种.但它的最优解应该只有一种思路,即从下至上的归并,时间复杂度 ...

  4. leetcode 148. Sort List

    https://leetcode.com/problems/sort-list/discuss/46714/Java-merge-sort-solution 链表初始化代码:ListNode* ori ...

  5. Java数组排序: Array-ArrayList-List-Collections.sort()/List.sort()/Arrays.sort()

    文章目录 ArrayList/List 的排序:Collections.sort()/List.sort() Array 的排序:Arrays.sort() 此文首发于我的Jekyll博客:zhang ...

  6. LeetCode 905 Sort Array By Parity--Java stream,Python lambda表达式一行 解法

    题目地址:Sort Array By Parity - LeetCode Given an array A of non-negative integers, return an array cons ...

  7. LeetCode 75. Sort Colors (python一次遍历,模拟三路快排)

    LeetCode 75. Sort Colors (python一次遍历,模拟三路快排) 题目分析: 本题需要实现数字只包含0,1,2的排序,并且要求一次遍历. 由于只用把数字隔离开,很容易想到快排的 ...

  8. 148. Sort List 1

    Sort a linked list in O(n log n) time using constant space complexity. Example 1: Input: 4->2-> ...

  9. 更高效地刷OJ——Java中常用的排序方法,Array.sort(),Arrays.parallelSort(), Collections.sort()

    对于几大传统的排序算法我在前面博客中已经介绍过了,如果有想要了解的同学可以去看这篇博客八大排序:冒泡排序,选择排序,插入排序,堆排序,希尔排序,归并排序,计数排序但是我们在刷题过程中如果题目中没有对排 ...

最新文章

  1. AI项目对接第二期——缺陷检测
  2. ​基于BCI的现代神经反馈有助于认知增强
  3. Linux-下载传输并安装启动Tomcat
  4. 浅谈PHP在各系统平台下的换行符
  5. 【机器学习基础】对样本不均衡的处理
  6. pcb设计单点接地示意图_答案:关于PCB 的EMC设计知识考卷
  7. android 编辑9图片,Android基础入门教程——1.6 .9(九妹)图片怎么玩
  8. [No0000B3].NET C# 单体模式(Singleton)
  9. maven学习(2)
  10. Maven学习总结(23)——Maven常用命令介绍
  11. 关于Patter类和Match类
  12. 对数几率回归(Logistic Regression)
  13. python AttributeError: 'module' object has no attribute 'dumps'解决办法
  14. SLAM之PTAM学习笔记
  15. 对所有员工的薪水按照salary降序进行1-N的排名
  16. matlab中appdesigner的控件简单讲解
  17. Mybatis的代码
  18. 读《混世小农民》有感
  19. 计算机计算的应用,计算器计算
  20. 中国涂料工业协会:世界十大涂料品牌2011年度报告

热门文章

  1. 【Redis】Redis入门与安装步
  2. 【Git】切换分支,以及git stash的使用
  3. 【Java文件操作(七)】序列化:将自定义类写入文件
  4. 牛客网_PAT乙级_1019旧键盘 (20)
  5. Hive体系结构(二)Hive的执行原理、与关系型数据库的比较
  6. Leet Code OJ 268. Missing Number [Difficulty: Medium]
  7. Java正则表达式简单用法
  8. css修改select选择框option被选中的背景颜色_这五个有用的 CSS 属性完全被我忽视了...
  9. 【终极办法!】idea没有import project解决办法
  10. 算法竞赛入门经典(第二版) | 程序3-10 生成元 (UVa1584,Circular Sequence)