Description:
Sort a linked list in O(n log n) time using constant space complexity.
Analysis:
解法1:快排
分析:双指针解法和剑指offer中14题调整数组顺序使奇数位于偶数前面
快排思想:一前一后指针,向中间靠拢,但是单链表没有前驱,只能向一个方向移动,所以采用双指针解法。
指针p始终指向小于等于pivot的最后一个值,指针q作为移动指针,[0~p]都是小于等于pivot的值,[p+1, q]都是大于pivot的值。
解法2:合并排序
解法1代码:
class Solution {
public:
ListNode* sortList(ListNode* head) {
if (head == 0 || head->next == 0)
return head;
ListNode *begin = head, *end = 0;
quickSort(begin, end);
return begin;
}
void quickSort(ListNode *begin, ListNode *end) {
if (begin != end) {
ListNode *pos = partition(begin, end);
quickSort(begin, pos);
quickSort(pos->next, end);
}
}
ListNode *partition(ListNode *begin, ListNode *end) {
int pivot = begin->val;
ListNode *p = begin;
ListNode *q = begin->next;
while (q != end) {
if (q->val < pivot) {
p = p->next;
swap(p->val, q->val);
}
q = q->next;
}
swap(p->val, begin->val);
return p;
}
};