Sort a linked list in O(n log n) time using constant space complexity.
链表排序,nlogn复杂度
这里需要注意,一般常说归并排序需要额外的辅助空间,那是基于数组的情况,
而链表可以修改指针,不需要重新申请空间,所以空间复杂度并没有那么高。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* getMid(ListNode* head)
{
ListNode* p1 = head;
ListNode* p2 = head->next;
while(p2 && p2->next)
{
p1 = p1->next;
p2 = p2->next->next;
}
return p1;
}
ListNode* merge(ListNode* head1,ListNode* head2)
{
ListNode* p1 = head1;
ListNode* p2 = head2;
ListNode* res = new ListNode(0);
ListNode* res2 = res;
while(p1 || p2)
{
if(!p1)
{
res->next = p2;
break;
}
else if(!p2)
{
res->next = p1;
break;
}
else if(p1->val < p2->val)
{
res->next = p1;
p1 =p1->next;
}
else
{
res->next = p2;
p2 = p2->next;
}
res = res->next;
}
return res2->next;
}
ListNode* sortList(ListNode* head)
{
if(!head || !head->next) return head;
ListNode* mid = getMid(head);
ListNode* head2 = mid->next;
mid->next = NULL;
return merge(sortList(head), sortList(head2));
}
};