问题:
Sort a linked list in O(n log n) time using constant space complexity.
分析:
用divide and conquer。首先遍历一次,找到长度;然后遍历一半,找到中间点;然后在左右两半recursion,然后merge。
Time complexity: T(n) = 2T(n/2) + n = O(n log n)。
代码:
ListNode *mergeList(ListNode *left, ListNode *right) {
ListNode dummy(0);
ListNode *curr = &dummy;
while (left || right) {
if (!left) {
curr->next = right;
break;
}
if (!right) {
curr->next = left;
break;
}
int l = left->val;
int r = right->val;
if (l < r) {
curr->next = left;
left = left->next;
curr = curr->next;
}
else {
curr->next = right;
right = right->next;
curr = curr->next;
}
}
return dummy.next;
}
class Solution {
public:
ListNode *sortList(ListNode *head) {
if (!head)
return head;
int n = 0;
ListNode *curr = head;
while (curr) {
n ++;
curr = curr->next;
}
if (n == 1)
return head;
int half = n / 2;
curr = head;
for (int i = 0; i < half; i ++) {
curr = curr->next;
}
ListNode * right = curr->next;
curr->next = NULL;
ListNode * left = sortList(head);
right = sortList(right);
return mergeList(left, right);
}
};