sort list java leetcode_[LeetCode] 148. Sort List Java
题目: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相关推荐
- LeetCode 148. Sort List--面试算法题--C++,Python解法
LeetCode 148. Sort List–面试算法题–C++,Python解法 LeetCode题解专栏:LeetCode题解 LeetCode 所有题目总结:LeetCode 所有题目总结 大 ...
- 【归并排序+递归】LeetCode 148. Sort List
LeetCode 148. Sort List Solution1:我的答案 很多递归 /*** Definition for singly-linked list.* struct ListNode ...
- leetcode 148. Sort List | 148. 排序链表(最优解归并排序,O(1)空间)
题目 https://leetcode.com/problems/sort-list/ 题解 分析 就链表排序问题来说,它的解法可以有好多种.但它的最优解应该只有一种思路,即从下至上的归并,时间复杂度 ...
- leetcode 148. Sort List
https://leetcode.com/problems/sort-list/discuss/46714/Java-merge-sort-solution 链表初始化代码:ListNode* ori ...
- Java数组排序: Array-ArrayList-List-Collections.sort()/List.sort()/Arrays.sort()
文章目录 ArrayList/List 的排序:Collections.sort()/List.sort() Array 的排序:Arrays.sort() 此文首发于我的Jekyll博客:zhang ...
- 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 ...
- LeetCode 75. Sort Colors (python一次遍历,模拟三路快排)
LeetCode 75. Sort Colors (python一次遍历,模拟三路快排) 题目分析: 本题需要实现数字只包含0,1,2的排序,并且要求一次遍历. 由于只用把数字隔离开,很容易想到快排的 ...
- 148. Sort List 1
Sort a linked list in O(n log n) time using constant space complexity. Example 1: Input: 4->2-> ...
- 更高效地刷OJ——Java中常用的排序方法,Array.sort(),Arrays.parallelSort(), Collections.sort()
对于几大传统的排序算法我在前面博客中已经介绍过了,如果有想要了解的同学可以去看这篇博客八大排序:冒泡排序,选择排序,插入排序,堆排序,希尔排序,归并排序,计数排序但是我们在刷题过程中如果题目中没有对排 ...
最新文章
- AI项目对接第二期——缺陷检测
- ​基于BCI的现代神经反馈有助于认知增强
- Linux-下载传输并安装启动Tomcat
- 浅谈PHP在各系统平台下的换行符
- 【机器学习基础】对样本不均衡的处理
- pcb设计单点接地示意图_答案:关于PCB 的EMC设计知识考卷
- android 编辑9图片,Android基础入门教程——1.6 .9(九妹)图片怎么玩
- [No0000B3].NET C# 单体模式(Singleton)
- maven学习(2)
- Maven学习总结(23)——Maven常用命令介绍
- 关于Patter类和Match类
- 对数几率回归(Logistic Regression)
- python AttributeError: 'module' object has no attribute 'dumps'解决办法
- SLAM之PTAM学习笔记
- 对所有员工的薪水按照salary降序进行1-N的排名
- matlab中appdesigner的控件简单讲解
- Mybatis的代码
- 读《混世小农民》有感
- 计算机计算的应用,计算器计算
- 中国涂料工业协会:世界十大涂料品牌2011年度报告
热门文章
- 【Redis】Redis入门与安装步
- 【Git】切换分支,以及git stash的使用
- 【Java文件操作(七)】序列化:将自定义类写入文件
- 牛客网_PAT乙级_1019旧键盘 (20)
- Hive体系结构(二)Hive的执行原理、与关系型数据库的比较
- Leet Code OJ 268. Missing Number [Difficulty: Medium]
- Java正则表达式简单用法
- css修改select选择框option被选中的背景颜色_这五个有用的 CSS 属性完全被我忽视了...
- 【终极办法!】idea没有import project解决办法
- 算法竞赛入门经典(第二版) | 程序3-10 生成元 (UVa1584,Circular Sequence)