Sort a linked list in O(n log n) time using constant space complexity.
单链表排序,要求O(nlogn),使用归并
class Solution {
public:
//归并
ListNode * MergeList(ListNode * a ,ListNode * b) {
ListNode pre(-1);
ListNode * cur = ⪯
while(a!=NULL && b!=NULL) {
if(a->val < b->val){
cur->next = a;
a = a->next;
}else{
cur->next = b;
b = b->next;
}
cur = cur -> next;
}
if(a!=NULL) cur->next = a;
if (b!=NULL) cur->next = b;
return pre.next;
}
//分割链表
void SplitList(ListNode * head,ListNode * & l , ListNode* & r) {
ListNode pre(-1);
pre.next = head;
if(head==NULL || head->next ==NULL) {
l = head;
r = NULL;
} else {
ListNode * mid = &pre,*tail=⪯
while(tail) {
tail = tail->next;
if(tail) {
tail = tail->next;
mid = mid->next;
}
}
r = mid->next;
mid->next = NULL;
l = head;
}
}
ListNode *sortList(ListNode *head) {
if(head == NULL || head->next==NULL) {
return head;
}
ListNode * l = NULL,*r = NULL;
SplitList(head,l,r);
l = sortList(l);
r = sortList(r);
return MergeList(l,r);
}
};