Sort a linked list in O(n log n) time using constant space complexity.
Example 1:Input: 4->2->1->3
Output: 1->2->3->4
Example 2:Input: -1->5->3->4->0
Output: -1->0->3->4->5
用的归并排序。注意将链表对半分的时候,一般的快慢指针的慢指针落在中间节点的下一个,这会导致重复循环,所以要做一些微调。
class Solution {
public:
ListNode* sortList(ListNode* head) {
if(!head||!head->next)
return head;
ListNode *slower=head;
ListNode *slow=head->next;
ListNode *fast=head->next->next;
while(fast&&fast->next){
slower=slower->next;
slow=slow->next;
fast=fast->next->next;
}
slower->next=NULL;
ListNode *left=sortList(head);
ListNode *right=sortList(slow);
ListNode *start=new ListNode(0);
ListNode *cur=start;
while(left&&right){
if(left->val<right->val){
cur->next=left;
left=left->next;
}
else{
cur->next=right;
right=right->next;
}
cur=cur->next;
}
while(left){
cur->next=left;
left=left->next;
cur=cur->next;
}
while(right){
cur->next=right;
right=right->next;
cur=cur->next;
}
ListNode *result=start->next;
delete start;
start=NULL;
return result;
}
};