单链表的归并排序

来源:互联网 发布:永井豪 知乎 编辑:程序博客网 时间:2024/05/21 11:08

由于单链表没有指向前一个节点的指针,而归并排序排序不需要对前一个节点进行操作,所以归并排序算法很适合用来对单链表排序,代码如下:

#include "stdafx.h"#include <iostream>using namespace std;  struct ListNode {      int val;      ListNode *next;      ListNode(int x) : val(x), next(NULL) {}  }; class Solution {public:    ListNode *sortList(ListNode *head) {        if(head==NULL || head->next==NULL)            return head;        ListNode* fast=head,*slow=head;        while(fast->next!=NULL &&fast->next->next!=NULL) //归并排序,需要用到中间节点,快慢指针是求链表中间节点常用的方法        {            fast=fast->next->next;            slow=slow->next;        }        fast=slow;        slow=slow->next;        fast->next=NULL;        ListNode *leftList=sortList(head);        ListNode *rightList=sortList(slow);        return mergeInsert(leftList,rightList);    }    ListNode *mergeInsert(ListNode *leftList,ListNode *rightList)    {        ListNode tmpNode(-1);        ListNode *pTemp;        for(pTemp=&tmpNode;leftList!=nullptr && rightList!=nullptr;pTemp=pTemp->next)        {            if(leftList->val<=rightList->val)            {                pTemp->next=leftList;                leftList=leftList->next;            }            else            {                 pTemp->next=rightList;                rightList=rightList->next;            }        }        while(leftList!=nullptr)        {            pTemp->next=leftList;            pTemp=pTemp->next;            leftList=leftList->next;        }        while(rightList!=nullptr)        {            pTemp->next=rightList;            pTemp=pTemp->next;            rightList=rightList->next;        }        return tmpNode.next;    }};int _tmain(int argc, _TCHAR* argv[]){struct ListNode head(-1);int inputNodeNum=0;struct ListNode *pHead=&head;Solution sln;while (cin>>inputNodeNum){int valTmp=0;for (int i=0;i<inputNodeNum;++i){cin>>valTmp;pHead->next=new struct ListNode(valTmp);pHead=pHead->next;}struct ListNode* pResult=sln.sortList(head.next);struct ListNode* pTmpResult=pResult;while(pTmpResult!=nullptr){cout<<pTmpResult->val<<"  ";pTmpResult=pTmpResult->next;}while(pResult!=nullptr){pTmpResult=pResult;pResult=pResult->next;delete pTmpResult;}}return 0;}


0 0
原创粉丝点击