Sort a linked list in O(n log n) time using constant space complexity.
ListNode *Merge(ListNode *list01,ListNode *list02){
ListNode *head=NULL,*pointer=NULL;
if(NULL!=list01&&NULL!=list02&&list01->val<list02->val){
pointer=list01;
head=list01;
list01=list01->next;
}
else if(NULL!=list01&&NULL!=list02){
pointer=list02;
head=list02;
list02=list02->next;
}
while (list01&&list02)
{
if(list01->val<list02->val){
pointer->next=list01;
pointer=list01;
list01=list01->next;
}
else
{
pointer->next=list02;
pointer=list02;
list02=list02->next;
}
}
if(pointer){
pointer->next=list01==NULL?list02:list01;
}else
{
head=list01==NULL?list02:list01;
}
return head;
}
ListNode *sortList(ListNode *head) {
ListNode *start1=head,*end1=NULL,*low=head,*fast=head;
ListNode *start2=NULL,*end2=NULL;
if(head==NULL) return NULL;
while (fast->next&&fast->next->next)
{
low=low->next;
fast=fast->next->next;
}
if(NULL==low->next){
return low;
}
else
{
start1=head;
start2=low->next;
low->next=NULL;
}
return Merge(sortList(start1),sortList(start2));
}