1.问题描述
Sort a linked list in O(n log n) time using constant space complexity.
链表排序。
2.解答
/**
* Definition for singly-linked list.
* 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* head1=NULL;
ListNode* head2=NULL;
splitlist(head,&head1,&head2);
ListNode* left=sortList(head1);
ListNode* right=sortList(head2);
return mergetwolist(left,right);
}
ListNode* mergetwolist(ListNode* head1,ListNode* head2)
{
if(!head1) return head2;
if(!head2) return head1;
ListNode* head=new ListNode(0);
ListNode* pre=head;
while(head1!=NULL && head2!=NULL)
{
if(head1->val<head2->val)
{
pre->next=head1;
pre=pre->next;
head1=head1->next;
}
else
{
pre->next=head2;
pre=pre->next;
head2=head2->next;
}
}
if(!head1)
{
pre->next=head2;
}
if(!head2)
{
pre->next=head1;
}
pre=head->next;
delete head;
return pre;
}
void splitlist(ListNode* head,ListNode** head1,ListNode** head2)
{
if(head==NULL || head->next==NULL)
{
*head1=head;
*head2=NULL;
}
else
{
ListNode* slow=head;
ListNode* fast=head->next;
while(fast!=NULL && fast->next!=NULL)
{
slow=slow->next;
fast=fast->next->next;
}
*head1=head;
*head2=slow->next;
slow->next=NULL;
}
}
};