思路:
1.使用了quicksort,但效果并不好。 当序列很长,但元素的取值范围很窄时,或序列基本有序时,快排的时间复杂度退化为O(n*n)
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) {
return quickSort(head);
}
ListNode *quickSort(ListNode* &head){
for (auto ptr = head; ptr; ptr = ptr->next){
if (!ptr->next)
return head;// 序列有序时,停止快排,直接返回head
else{
if (ptr->val > ptr->next->val)
break;
}
}
if (!head)
return head;
ListNode* le = new ListNode(0);
ListNode* nle = new ListNode(0);
ListNode* pivot = head;
for (auto ptr = head->next; ptr;){
if (ptr->val <= pivot->val)
insert(le, ptr);
else
insert(nle, ptr);
}
pivot->next =NULL;
ListNode *newHead = quickSort(le->next);
if (!newHead)
newHead = pivot;
else{
ListNode* le_tail = newHead;
while(le_tail->next)
le_tail = le_tail->next;
le_tail->next = pivot;
}
pivot->next = quickSort(nle->next);
return newHead;
}
inline void insert(ListNode* &head, ListNode* &ptr){
auto tmp = ptr->next;
ptr->next = head->next;
head->next = ptr;
ptr = tmp;
}
};