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