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
原创粉丝点击