Description:
Sort a linked list in O(n log n) time using constant space complexity.
Analysis:
147是插入排序,时间复杂度O(N^2),这里要求O(n log n),快排满足要求。
快排是用分治的思想,将链表分成两个子链表分别排序,然后再合并链表。
Solution:
class Solution {
public:
ListNode* sortList(ListNode* head) {
if (head == NULL || head->next == NULL)
return head;
ListNode *fast = head->next, *slow = head;
while (fast && fast->next) {
slow = slow->next;
fast = fast->next->next;
}
ListNode *head2 = slow->next;
slow->next = NULL;
ListNode *head1 = head;
head1 = sortList(head1);
head2 = sortList(head2);
ListNode *newhead = mergeList(head1, head2);
return newhead;
}
ListNode* mergeList(ListNode *head1, ListNode *head2) {
if (head1 == NULL)
return head2;
if (head2 == NULL)
return head1;
ListNode *head3 = NULL, *mov = NULL;
if (head1->val < head2->val) {
head3 = head1;
head1 = head1->next;
} else {
head3 = head2;
head2 = head2->next;
}
mov = head3;
while (head1 && head2) {
if (head1->val < head2->val) {
mov->next = head1;
head1 = head1->next;
} else {
mov->next = head2;
head2 = head2->next;
}
mov = mov->next;
}
if (head1) {
mov->next = head1;
}
if (head2) {
mov->next = head2;
}
return head3;
}
};