#include <iostream>
#include <string>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode* createList()
{
int n;
cin>>n;
if (n<1) return nullptr;
ListNode* dumy=new ListNode(-1);
ListNode* tail=dumy;
int tmp;
for(int i=0; i<n; ++i){
cin>>tmp;
tail->next=new ListNode(tmp);
tail=tail->next;
}
ListNode* head=dumy->next;
delete dumy;
return head;
}
class Solution {
public:
ListNode* sortList(ListNode* head)
{
if (nullptr==head || nullptr==head->next)
return head;
ListNode* p1=head,*p2=head->next;
while(nullptr!=p2 && nullptr!=p2->next){
p1=p1->next;
p2=p2->next->next;
}
p2=p1->next;
p1->next=nullptr;
p1=sortList(head);
p2=sortList(p2);
return mergeSort(p1,p2);
}
ListNode* mergeSort(ListNode* left,ListNode* right)
{
if (nullptr==left && nullptr==right)
return nullptr;
ListNode* dumy = new ListNode(0);
ListNode* tail=dumy;
while(nullptr!=left && nullptr!=right){
if (left->val<right->val){
tail->next=left;
left=left->next;
}else{
tail->next=right;
right=right->next;
}
tail=tail->next;
}
if (nullptr!=left){
tail->next=left;
}
if (nullptr!=right){
tail->next=right;
}
ListNode* head=dumy->next;
delete dumy;
return head;
}
};
int main()
{
ListNode* head=createList();
Solution s;
ListNode* tmp=s.sortList(head);
while(nullptr!=tmp){
cout<<tmp->val<<" ";
tmp=tmp->next;
}
cout<<endl;
}
单链表的归并排序
最新推荐文章于 2022-11-27 19:29:34 发布