Leetcode在线编程sort-list
题目链接
题目描述
Sort a linked list in O(n log n) time using constant space complexity.
题意
将链表进行排序,要求O(nlog n)的时间复杂度
解题思路
一种另类思路的快速排序(借鉴某位GG的思路
快速排序最为重要一点就是每趟排序都要找出支点
我们可以设置这样的2个指针p,q来实现找支点的问题
在p之前的元素都小于key,在p,q之间的元素都大于key,一旦q到了链表末尾,此时p位置就成为了key元素所应该在位置(在p之前小于key,p位置等于key,在p之后大于key)
接下来就是怎么实现p,q指针了
具体看图吧
AC代码
/**
class Solution {
public:
ListNode *GetPartion(ListNode *pbegin , ListNode *pend)//得到支点
{
ListNode *p = pbegin;
ListNode *q = p->next;
int key = pbegin->val;
while(q!=pend)
{
if(q->val<key)
{
p = p->next;
int tmp = p->val;
p->val = q->val;
q->val = tmp;
}
q = q->next;
}
int tmp = pbegin->val;
pbegin->val = p->val;
p->val = tmp;
return p;
}
void quict_sort(ListNode *&head,ListNode *pend)
{
if(head!=pend)
{
ListNode *tmp = GetPartion(head,pend);
quict_sort(head,tmp);
quict_sort(tmp->next,pend);
}
}
ListNode *sortList(ListNode *head)
{
quict_sort(head,NULL);
return head;
}
};