题目链接:LCR 077. 排序链表
注:该题与 148. 排序链表 完全一样
代码如下:
class Solution {
public:
ListNode* sortList(ListNode* head)
{
return msort(head,nullptr);
}
ListNode* msort(ListNode* head,ListNode* tail)
{
if(head==nullptr)
return head;
if(head->next==tail)
{
head->next=nullptr;
return head;
}
ListNode* mid=getMiddle(head,tail);
return merge(msort(head,mid),msort(mid,tail));
}
ListNode* merge(ListNode* head1,ListNode* head2)
{
ListNode* Head=new ListNode;
Head->next=nullptr;
ListNode *temp=Head,*temp1=head1,*temp2=head2;
while(temp1&&temp2)
{
if(temp1->val<temp2->val)
{
temp->next=temp1;
temp1=temp1->next;
}
else
{
temp->next=temp2;
temp2=temp2->next;
}
temp=temp->next;
}
if(temp1)
temp->next=temp1;
if(temp2)
temp->next=temp2;
return Head->next;
}
ListNode* getMiddle(ListNode* head,ListNode* tail)
{
ListNode* slow=head,*fast=head;
while(fast!=tail)
{
slow=slow->next;
fast=fast->next;
if(fast!=tail)
fast=fast->next;
}
return slow;
}
};
/*
//直接插入排序,会超时
class Solution {
public:
ListNode* sortList(ListNode* head)
{
if(head==nullptr||head->next==nullptr)
return head;
ListNode *Head=new ListNode;
Head->next=nullptr;
Head->next=head;
ListNode *p=Head->next,*pre;
ListNode *r=p->next;
p->next=nullptr;
p=r;
while(p)
{
pre=Head;
r=p->next;
while(pre->next&&pre->next->valval)
pre=pre->next;
p->next=pre->next;
pre->next=p;
p=r;
}
head=Head->next;
delete Head;
return head;
}
};
*/