单链表排序--归并排序

#include <iostream>

#include <cstdlib>

using namespace std;

struct ListNode //默认为public

{

    int data;

    ListNode* next;

    ListNode(int x, ListNode* nextNode):data(x), next(nextNode){}

};



ListNode* mergeData(ListNode* first, ListNode* second)

{

    if(first == nullptr) return second;

    if(second == nullptr) return first;

    //合并两个链表,按从小到大的顺序

    ListNode* new_head = new (nothrow) ListNode(0, nullptr); //分配失败返回空指针

    if(new_head == nullptr) exit(0);

    ListNode* ptr = new_head;

    while(first != nullptr && second != nullptr)

    {

        if(first->data < second->data)

        {

            ptr->next = first;

            first = first->next;

        }

        else

        {

            ptr->next = second;

            second = second->next;

        }

        ptr = ptr->next;

    }

    //合并剩余部分(对于数组进行归并排序,这部分可通过设置哨兵来省略)

    if(first != nullptr) ptr->next = first;

    if(second != nullptr) ptr->next = second;

    return new_head->next;

}



//返回为结点指针类型,需要链表头节点

ListNode* mergeSort(ListNode* head)

{

    //递归调用,首先找到分裂点,对于链表可以使用快慢指针方法

    if(head == nullptr || head->next == nullptr) return head;

    ListNode* fast = head->next;

    ListNode* slow = head;

    while(fast != nullptr && fast->next != nullptr)

    {

        slow = slow->next;

        fast = fast->next->next;

    }

    //此时slow即为中间点,依次对slow之前的元素和之后的元素递归调用归并排序,然后进行合并

    ListNode* se = slow->next;

    slow->next = nullptr;

    ListNode* first = mergeSort(head);

    ListNode* second = mergeSort(se);

    return mergeData(first, second);

}



void printList(ListNode* head)

{

    if(head == nullptr) return;

    cout << head->data << " ";

    printList(head->next);

}



int main()

{

    ListNode* head =

        new ListNode(10, new ListNode(9, new ListNode(8, new ListNode(7, new ListNode(6, new ListNode(5, nullptr))))));

    printList(head);

    cout << endl;

    ListNode* new_head = mergeSort(head);

    printList(new_head);

    return 0;

}

  

你可能感兴趣的:(归并排序)