Sort List
来源:互联网 发布:淘宝新店上架多少宝贝 编辑:程序博客网 时间:2024/06/01 23:36
Sort a linked list in O(n log n) time using constant space complexity.
思路:当看到sort list 时 肯定会想到 sort array是怎样做的。sort array 常用的两种方法有 quick sort 和merge sort。
而对于quick sort,每一次都要选择一个对照数字进行partition。当选第一个数字或者最后一个数字的时候,很有可能产生不平衡(例如这个array 本来就是排好序的,容易产生一边倒),即出现最坏情况。解决这种问题的办法便是 每次都取中间的数或者 random 取值。但是无论如何,快速排序是一种不稳定的算法,尽管它的平均时间复杂度是O(nlogn).
所以,对于list, 用merge sort 更好一些。merge sort 是一个严格的nlogn 的方法,可以避免出现最坏情况。还有一点对于sort list 使用merge sort的原因是 space complexity 是o(1). 对于数组而言,space complexity 是o(n). 可以对于list 则是o(1). 所以比较来看,对于linked list:
方法timespace quick sortO(nlogn) O(logn) unstablemerge sortO(nlogn)O(1) 如果是数组,空间复杂度为O(N)stable所以 这道题目用merge sort 解决更好。
用merge sort 解决这道题目主要有以下几个步骤:
findmid:找到要排序链表的中间结点(使用 faster lower node)
partition:将整个链表分为两个子链表
sort:对子链表进行排序
merge:将排号序的链表合并(其实对于任意两个队列,不过数据结构是数组还是链表,基本思路都是如此)
所以 这道题目主要考察的有三点:1快慢指针 2两个有序数列的合并 3recursive
/** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */public class Solution { public ListNode sortList(ListNode head) { if(head==null||head.next==null){ return head; } ListNode mid=findmid(head); ListNode head2=sortList(mid.next); mid.next=null;//be careful of this statement, if it is omited, it will go wrong. ListNode head1=sortList(head); return merge(head1,head2); } private ListNode findmid(ListNode head){ ListNode faster = head; ListNode slower = head; while(faster.next!=null&&faster.next.next!=null){ slower=slower.next; faster=faster.next.next; } return slower; } private ListNode merge(ListNode head1,ListNode head2){ ListNode dummy=new ListNode(0); ListNode tail=dummy; while(head1!=null&&head2!=null){ if(head1.val<=head2.val){ tail.next=head1; head1=head1.next; }else{ tail.next=head2; head2=head2.next; } tail=tail.next; } if(head1!=null){ tail.next=head1; }else{ tail.next=head2; } return dummy.next; } }
- list sort
- list sort
- Sort List
- Sort List
- list - sort
- Sort List
- Sort List
- Sort List
- Sort List
- Sort List
- Sort List
- Sort List
- Sort List
- Sort List
- Sort List
- Sort List
- Sort List
- Sort List
- BinSearchTree
- 什么是反向代理服务器,开放的反向代理软件使用
- 森蝶放学拔草带回家 孝顺称留给爸爸炒着吃
- LoadRunner11录制脚本为空
- Android 自动更新(模拟服务器)
- Sort List
- 那女孩对我说
- Hibernate的JAVA对象的3种状态
- ImageMagick库简介
- composer安装
- Java集合类详解
- c++通过互斥量实现单例模式
- 萧亚轩游韩国赌王女儿陪同 紧靠型男疑有新欢
- java.lang.OutOfMemoryError处理错误