Node
*
MergeSortLinks(Node
*
h,
int
n)
{
if(n<=1) return;
int n1,n2,i,t1=0,t2=0;
Node *h1,*h2,*hh=NULL,*cur=NULL,*p;
n1=n/2, n2=n-n1;
p=h;
for(i=0;i<n1;i++) p=p->next;
h1=MergeSortLinks(h,n1);
h2=MergeSortLinks(p,n2);
while(t1<n1 || t2<n2){
if(t1<n1 && t2<n2)
if(h1->key < h2->key) p=h1, h1=h1->next,t1++;
else p=h2, h2=h2->next,t2++;
else
if(t1<n1) p=h1, h1=h1->next,t1++;
else p=h2, h2=h2->next,t2++;
if(NULL==hh) hh=cur=p;
else cur->next=p, cur=cur->next;
}
h1=h2=p=cur=NULL;
return hh;
}
Node * Sort(Node * head) {
Node *p;
int n=0,i;
p=head;
while(p){
n++; p=p->next;
}
head=MergeSortLinks(head,n);
p=head;
for(i=0;i<n-1;i++)
p=p->next;
p->next=NULL;
}
if(n<=1) return;
int n1,n2,i,t1=0,t2=0;
Node *h1,*h2,*hh=NULL,*cur=NULL,*p;
n1=n/2, n2=n-n1;
p=h;
for(i=0;i<n1;i++) p=p->next;
h1=MergeSortLinks(h,n1);
h2=MergeSortLinks(p,n2);
while(t1<n1 || t2<n2){
if(t1<n1 && t2<n2)
if(h1->key < h2->key) p=h1, h1=h1->next,t1++;
else p=h2, h2=h2->next,t2++;
else
if(t1<n1) p=h1, h1=h1->next,t1++;
else p=h2, h2=h2->next,t2++;
if(NULL==hh) hh=cur=p;
else cur->next=p, cur=cur->next;
}
h1=h2=p=cur=NULL;
return hh;
}
Node * Sort(Node * head) {
Node *p;
int n=0,i;
p=head;
while(p){
n++; p=p->next;
}
head=MergeSortLinks(head,n);
p=head;
for(i=0;i<n-1;i++)
p=p->next;
p->next=NULL;
}