Sort a linked list in O(n log n) time using constant space complexity.
思路:使用归并的方式来实现链表的排序。先将链表一直拆分到一个个元素,对于每一个元素都是有序的,然后两两进行合并成一个有序链表。
解决代码如下:
/**
* 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) {//先将链表分成两个部分,然后再将两个链表进行merge
if(head==NULL || head->next==NULL)
return head;
ListNode *mid=findmid(head);
ListNode *right=sortList(mid->next);
mid->next=NULL;
ListNode *left=sortList(head);
return merge(left,right);
}
//返回一个链表的中间节点
ListNode *findmid(ListNode *head)
{
ListNode *slow=head,*fast=head->next;
while(fast!=NULL&&fast->next!=NULL)
{
slow=slow->next;
fast=fast->next->next;
}
cout<<slow->val<<endl;
return slow;
}
//合并两个有序链表
ListNode *merge(ListNode *slow,ListNode *fast)
{
ListNode *res=new ListNode(0);
ListNode *slo=res;
while(slow&&fast)
{
if(slow->val<=fast->val)
{
slo->next=slow;
slow=slow->next;
}
else
{
slo->next=fast;
fast=fast->next;
}
slo=slo->next;
}
if(slow)
slo->next=slow;
else if(fast)
slo->next=fast;
return res->next;
}
};