题目描述:
给定一个乱序的单链表的头节点,对该链表中的节点进行排序
要求时间复杂度为O(nlgn),空间复杂度为O(1)
分析:
由于题目要求时间复杂度我O(nlgn),因此选择排序和插入排序可以排除。
在排序算法中,时间复杂度为O(nlgn)的主要有:归并排序、快速排序、堆排序。
代码如下:
class
Solution {
public
:
ListNode* partion(ListNode* pbegin,ListNode* pend){
if
(pbegin==pend||pbegin->next==pend)
return
pbegin;
int
key=pbegin->val;
ListNode* p=pbegin;
ListNode* q=pbegin;
while
(q!=pend){
if
(q->val<key){
p=p->next;
swap(p->val,q->val);
}
q=q->next;
}
swap(p->val,pbegin->val);
return
p;
}
void
quick_sort(ListNode* pbegin,ListNode* pend){
if
(pbegin==pend||pbegin->next==pend)
return
;
ListNode* mid=partion(pbegin,pend);
quick_sort(pbegin,mid);
quick_sort(mid->next,pend);
}
ListNode *sortList(ListNode *head) {
if
(head==NULL||head->next==NULL)
return
head;
quick_sort(head,NULL);
return
head;
}
};