Sort a linked list in O(n log n) time using constant space complexity.
写呀写,一次又一次,总是搞不定,要么运行出错,要么超时。网上看了一下,原来需要考虑重复pivot的情况。总算过了。
/**
* 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) {
if (head == NULL) {
return NULL;
}
ListNode *last = head;
while (last->next != NULL) {
last = last->next;
}
return listQuickSort(head, last);
}
ListNode *listQuickSort(ListNode *&head, ListNode *&last) {
if (head != NULL && last != NULL && head != last) {
ListNode *ltail = NULL;
ListNode *pivot = NULL;
ListNode *ptail = NULL;
ListNode *rhead = NULL;
listPartition(head, ltail, pivot, ptail, rhead, last);
listQuickSort(head, ltail);
listQuickSort(rhead, last);
if (ltail != NULL) {
ltail->next = pivot;
}
else {
head = pivot;
}
ptail->next = rhead;
if (last == NULL) {
last = ptail;
}
}
return head;
}
void listPartition(ListNode *&head, ListNode *<ail,
ListNode *&pivot, ListNode *&ptail,
ListNode *&rhead, ListNode *&last) {
ListNode lguard(0);
ltail = &lguard;
ListNode pguard(0);
pivot = &pguard;
ptail = last;
ListNode *cur = head;
while (cur != ptail) {
if (cur->val < ptail->val) {
ltail->next = cur;
ltail = cur;
}
else if (cur->val > ptail->val) {
last->next = cur;
last = cur;
}
else {
pivot->next = cur;
pivot = cur;
}
cur = cur->next;
}
head = lguard.next;
pivot->next = ptail;
pivot = pguard.next;
if (ltail == &lguard) {
head = NULL;
ltail = NULL;
}
else {
ltail->next = pivot;
}
last->next = NULL;
if (last == ptail) {
rhead = NULL;
last = NULL;
}
else {
rhead = ptail->next;
}
}
};