#include <stdlib.h>
struct LinkList
{
int data;
struct LinkList * next;
};
void CreateLinkList(struct LinkList * );
void DisplayLinkList(struct LinkList *);
void DestoryLinkList(struct LinkList *L);
struct LinkList * MergeSort(struct LinkList *);
struct LinkList * Merge(struct LinkList *,struct LinkList *);
int main()
{
struct LinkList * L=(struct LinkList *)malloc(sizeof(struct LinkList));
CreateLinkList(L);
DisplayLinkList(L);
L=MergeSort(L);
DisplayLinkList(L);
DestoryLinkList(L);
}
void CreateLinkList(struct LinkList * L)
{
int n,i,data;
struct LinkList * p = L;
struct LinkList * q;
struct LinkList * r = L;
scanf("%d",&n);
scanf("%d",&data);
L->data=data;
for(i=1;i<n;i++)
{
scanf("%d",&data);
q=(struct LinkList *)malloc(sizeof(struct LinkList));
q->data=data;
r->next=q;
q->next=NULL;
r=q;
}
}
void DestoryLinkList(struct LinkList *L)
{
struct LinkList * pre=L;
struct LinkList * p=pre->next;
while(p!=NULL)
{
free(pre);
pre=p;
p=p->next;
}
free(p);
}
void DisplayLinkList(struct LinkList *L)
{
struct LinkList * p = L;
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
struct LinkList * Merge(struct LinkList * a,struct LinkList *b)
{
struct LinkList *pa=a;
struct LinkList *pb=b;
struct LinkList *re=NULL;
struct LinkList *q=NULL;
if(pa->data<pb->data)
{
re=q=pa;
pa=pa->next;
}
else
{
re=q=pb;
pb=pb->next;
}
while(pa!=NULL&&pb!=NULL)
{
if(pa->data<pb->data)
{
q->next=pa;
q=q->next;
pa=pa->next;
}
else
{
q->next=pb;
q=q->next;
pb=pb->next;
}
}
if(pa!=NULL) q->next=pa;
if(pb!=NULL) q->next=pb;
return re;
}
struct LinkList * MergeSort(struct LinkList * L)
{
if((L==NULL)||(L->next==NULL))
return L;
struct LinkList * a=L;
struct LinkList * b=L;
while(b->next!=NULL&&b->next->next!=NULL)
{
a=a->next;
b=b->next->next;
}
b=a->next;
a->next=NULL;
a=L;
return Merge(MergeSort(a),MergeSort(b));
}