用O(nlgn)时间对单链表排序,常量空间
参考:http://blog.csdn.net/xudli/article/details/16819545
思路:排序——O(nlgn)——》快排或者归并,选择归并,将链表分成两等分进行归并排序
ListNode *mergeSort(ListNode *head){//
ListNode *p=head;
ListNode *q=head;
ListNode *pre=head;
if(!p || !p->next) return head;
while(p && p->next){
p = p->next->next;
pre = q;
q = q->next;
}
pre->next = NULL;
ListNode *h1 = mergeSort(head);
ListNode *h2 = mergeSort(q);
return merge(h1, h2);
}
ListNode *merge(ListNode *h1, ListNode *h2){
ListNode *temp = new ListNode(0);
ListNode *p = temp;
while(h1 && h2){
if(h1->val < h2->val){
p->next = h1;
h1 = h1->next;
}
else{
p->next = h2;
h2 = h2->next;
}
p = p->next;
}
if(h1) p->next = h1;
else p->next = h2;
ListNode *h = temp->next;
delete temp;
return h;
}