#include "iostream"
using namespace std;
struct node{
node *next;
int data;
};
void print(node *head){
node *p = head;
while(p != NULL){
cout<<p->data<<"\t";
p = p->next;
}
cout<<endl;
}
int getLen(node *head){
node *p = head;
int len = 0;
while(p != NULL){
len++;
p = p->next;
}
return len;
}
node* merge(node* p1, node* p2){
node *p = NULL,*phead = NULL;//phead记录每一部分的头节点
while(p1!=NULL && p2!=NULL){
if(p1->data<=p2->data){
if(phead == NULL){
phead = p = p1;
p1 = p1->next;
}else{
p->next = p1;
p1 = p1->next;
p = p->next;
}
}else{
if(phead == NULL){
phead = p = p2;
p2 = p2->next;
}else{
p->next = p2;
p2 = p2->next;
p = p->next;
}
}
}
p->next = (p1==NULL)?p2:p1;
return phead;
}
node* mergeSort(node* p,int len){
if(len == 1) {
p->next = NULL; return p;
}
node *pmid = p;
for(int i=0;i<len/2;i++){
pmid = pmid->next;
}
node *p1 = mergeSort(p,len/2);
node *p2 = mergeSort(pmid,len-len/2);
return merge(p1,p2);
}
node* linkedListMergeSort(node* head){
int len = getLen(head);
return mergeSort(head,len);
}
void del(node *head){
node *p = head;
node *pNext = head;
while(pNext != NULL){
p = pNext;
pNext = pNext->next;
delete(p);
}
}
int main(int argc, char const *argv[])
{
node *head;
head = new node();
int value;
node * prev = NULL;
while(cin>>value){
if(prev == NULL){
head->next = NULL;
head->data = value;
prev = head;
}else{
node *p = new node();
p->next =NULL;
p->data = value;
prev->next = p;
prev = p;
}
}
head = linkedListMergeSort(head);
print(head);
del(head);
return 0;
}
http://blog.csdn.net/v_JULY_v/article/details/6057286