单链表的归并排序

#include<iostream>
#include<time.h>
using namespace std;


//链表的归并排序
struct listnode{
    int value;
    listnode* next;
    listnode(int value):value(value),next(NULL){}
};

listnode* find_mid(listnode* head){
    if(head==NULL)return NULL;
    listnode* fast=head;
    listnode* slow = head;
    while(fast->next!=NULL){
        if(fast->next->next!=NULL){
            fast = fast->next->next;
            slow = slow->next;
        }else
            break;
    }
    return slow;
}

listnode* merge_list(listnode* list1,listnode* list2){
    if(list1==NULL)return list2;
    if(list2==NULL)return list1;
    listnode* cur = NULL;
    listnode* head=NULL;
    if(list1->value<=list2->value){
        head = list1;
        list1 = list1->next;
    }else{
        head = list2;
        list2 = list2->next;
    }
    listnode* pnode = head;
    while(list1&&list2){
        if(list1->value<=list2->value){
            cur = list1;
            list1 = list1->next;
        }else{
            cur = list2;
            list2 = list2->next;
        }
        pnode->next = cur;
        pnode = pnode->next;
    }
    if(list1 == NULL)pnode->next = list2;
    if(list2 == NULL)pnode->next = list1;
    return head;
}

listnode* merge_sort(listnode* head){
    if(head==NULL||head->next==NULL)return head;
    listnode* mid = find_mid(head);
    listnode* m = mid->next;
    mid->next = NULL;
    listnode* list1 = merge_sort(head);
    listnode* list2 = merge_sort(m);
    head = merge_list(list1,list2);
    return head;
}
int main(){
    int length = 10;
    listnode* r = new listnode(0);
    listnode* head = r;
    for(int i=0;i<length;i++){
        r->next = new listnode(rand()%30);
        r = r->next;
    }
    listnode* p = merge_sort(head->next);
    delete head;
    head= p;
    while(head){
        listnode* temp = head;
        head = head->next;
        cout<<temp->value<<endl;
        delete temp;
    }
    system("pause");
}
原文地址:https://www.cnblogs.com/zhang-wen/p/4796253.html