[LeetCode]Sort List
2016-12-08 17:07
344 查看
Question
Sort a linked list in O(n log n) time using constant space complexity.
本题难度Medium。
归并
【复杂度】
时间 O(Nlog(N)) 空间 O(1)
【思路】
题目要求时间复杂度O(Nlog(N)) 常数空间。对于单向链表适合用归并排序,双向链表适合用快速排序。
【注意】
第4行的检测是不可或缺的,否则会造成快慢法以及第12行出现”NullPoint”错误:
第12行对链表的剪断也是必须的,否则子链表的排序将会越界。
【代码】
Sort a linked list in O(n log n) time using constant space complexity.
本题难度Medium。
归并
【复杂度】
时间 O(Nlog(N)) 空间 O(1)
【思路】
题目要求时间复杂度O(Nlog(N)) 常数空间。对于单向链表适合用归并排序,双向链表适合用快速排序。
【注意】
第4行的检测是不可或缺的,否则会造成快慢法以及第12行出现”NullPoint”错误:
if(head==null||head.next==null)return head;
第12行对链表的剪断也是必须的,否则子链表的排序将会越界。
//cut off the 2 lists fast=slow;slow=slow.next;fast.next=null;
【代码】
public class Solution {
public ListNode sortList(ListNode head) {
//require
if(head==null||head.next==null)return head;
//find the middle node
ListNode fast=head,slow=head;
while(fast.next!=null&&fast.next.next!=null){
fast=fast.next.next;
slow=slow.next;
}
//cut off the 2 lists fast=slow;slow=slow.next;fast.next=null;
//invariant
ListNode l1=sortList(head),l2=sortList(slow);
return mergeList(l1,l2);
}
private ListNode mergeList(ListNode l1,ListNode l2){
//require
ListNode fake=new ListNode(0),cur=fake;
//invariant
while(l1!=null&&l2!=null){
if(l1.val<l2.val){
cur.next=l1;
l1=l1.next;
}else{
cur.next=l2;
l2=l2.next;
}
cur=cur.next;
}
if(l1==null)cur.next=l2;
else cur.next=l1;
//ensure
return fake.next;
}
}
相关文章推荐
- [C/C++]反转链表
- C#实现基于链表的内存记事本实例
- C#模拟链表数据结构的实例解析
- C语言实现带头结点的链表的创建、查找、插入、删除操作
- C++利用静态成员或类模板构建链表的方法讲解
- C++实现简单的学生管理系统
- Linux内核链表实现过程
- C++链表倒序实现方法
- C#通过链表实现队列的方法
- 举例讲解C语言对归并排序算法的基础使用
- Node.js环境下JavaScript实现单链表与双链表结构
- C#实现的简单链表类实例
- java实现归并排序算法
- 找出链表倒数第n个节点元素的二个方法
- Java数据结构之简单链表的定义与实现方法示例
- Java模拟有序链表数据结构的示例
- C语言单循环链表的表示与实现实例详解
- C++实现八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序等
- C++实现自底向上的归并排序算法
- C++实现的链表类实例