Sort a linked list in O(n log n) time using constant space complexity.
思路:采用类似数组的分治排序的思想对链表进行排序,使其时间复杂度达到 O(n log n) 的要求。
先将链表分割成两部分,分别对其排好序。再将排好序的链表进行合并。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* sortList(ListNode* head) {
if(!head||!head->next) return head;
ListNode* slow=head,*fast=head;
while(fast->next&&fast->next->next)
{
slow=slow->next;
fast=fast->next->next;
}
if(slow)
{
ListNode* mid=slow->next;
slow->next=NULL;//将链表分成两部分,从中间切开
ListNode* p2=sortList(head);
ListNode* p1=sortList(mid);
return merge(p1,p2);
}else
return slow;
}
ListNode* merge(ListNode* p1,ListNode* p2)//对两个链表归并
{
ListNode* l=new ListNode(0);
ListNode* head=l;
while(p1&&p2)
{
if(p1->val<p2->val)
{
l->next=p1;
p1=p1->next;
}else
{
l->next=p2;
p2=p2->next;
}
l=l->next;
}
if(p1)
l->next=p1;
if(p2)
l->next=p2;
return head->next;
}
};