148. Sort List
来源:互联网 发布:守望先锋 网络质量 编辑:程序博客网 时间:2024/05/17 04:23
Sort a linked list in O(n log n) time using constant space complexity.
表面上看,能够有O(n lgn)时间复杂度的算法为,快速排序,堆排序,归并排序,三者的空间复杂度分别为O(1), O(N),O(N)
通常而言,也就是针对数组而言,归并排序的空间复杂度为O(N), 你需要开出O(N)的额外空间来容纳数组,来表示归并后的顺序。但是,对于链表而言,你可以省下这部分空间的开销,你只需要改变节点的next指针的指向,就可以表示新的归并后的顺序了,所以空间复杂度陡然降到了O(1)。
class Solution {public: ListNode* sortList(ListNode* head) { if(head==NULL||head->next==NULL) return head; ListNode *slow=head; ListNode *fast=slow->next; while(fast&&fast->next) { slow=slow->next; fast=fast->next->next; } ListNode *back=slow->next; slow->next=NULL; head=sortList(head); back=sortList(back); return merge(head,back); } ListNode *merge(ListNode *left,ListNode *right) { ListNode *head=new ListNode(-1); ListNode *temp=head; while(left&&right) { if(left->val<right->val) { temp->next=left; left=left->next; } else { temp->next=right; right=right->next; } temp=temp->next; } while(left) temp->next=left; while(right) temp->next=right; return head->next; }};
归纳一下,就是说,如果待排序的元素存储在数组中,那么快速排序相对归并排序就有两个原因更快。一是,可以很快地进行元素的读取(相对于链表,数组的元素是顺序摆放的,而链表的元素是随机摆放的),数组的partion这步就比链表的partion这步快。二是,归并排序在merge阶段需要辅助数组,需要申请O(N)的空间,申请空间也是需要时间的。而快排不需要额外申请空间。如果待排序的元素存储在链表中,快排的优点就变成了缺点。归并排序于是就速度更优了。
0 0
- Sort-----148. Sort List
- 148. Sort List leetcode list
- LeetCode 148. Sort List
- [LeetCode]148.Sort List
- 148. Sort List
- [leetcode] 148.Sort List
- 148. Sort List
- 148. Sort List LeetCode
- Leetcode 148. Sort List
- 148. Sort List
- 148. Sort List
- 148. Sort List
- 148. Sort List
- 148. Sort List
- 148. Sort List
- LeetCode *** 148. Sort List
- 148. Sort List
- LeetCode 148. Sort List
- QGIS2.3+VS2010+Win7编译
- socket中的select 、 poll、epoll的区别
- 简单的Python类
- 转载]决策树ID3、C4.5、CART科普
- 百度杯”CTF比赛(十一月场)
- 148. Sort List
- 购买阿里云服务器-创建阿里云实例
- 我的产品开发之旅(4) - 设计UI定义相关表
- 漫谈继承技术(三)
- 倒置一个句子中的英文单词
- 课题投票(WEB开发)
- Struts旅程(五)struts控制器DispatchAction
- Java中自定义枚举(Enum)项的值,可设置为指定的值
- qt:graphicsitem graphicsscene graphicsview坐标关系实例