Cho danh sách liên kết, sắp xếp trong O(n log n) với không gian O(1). Ví dụ: [4,2,1,3] → [1,2,3,4].
Giải thuật
- Hàm
merge(l1, l2)trộn hai danh sách đã sắp xếp. - Hàm
sortList(head):- Nếu
head == nullhoặchead->next == nulltrả vềhead. slow = head, fast = head, prev = null.- Khi
fast && fast->next:prev = slow; slow = slow->next; fast = fast->next->next. prev->next = null.l1 = sortList(head),l2 = sortList(slow).- Trả về
merge(l1, l2).
- Nếu
Ví dụ mã C++
#include <bits/stdc++.h>
using namespace std;
class ListNode {
public:
int val;
ListNode *next;
ListNode(int data) { val = data; next = NULL; }
};
class Solution {
public:
ListNode* sortList(ListNode* head) {
if (!head || !head->next) return head;
ListNode *slow = head, *fast = head, *prev = NULL;
while (fast && fast->next) {
prev = slow;
slow = slow->next;
fast = fast->next->next;
}
prev->next = NULL;
ListNode* l1 = sortList(head);
ListNode* l2 = sortList(slow);
return mergeList(l1, l2);
}
ListNode* mergeList(ListNode* l1, ListNode* l2) {
ListNode* dummy = new ListNode(0);
ListNode* p = dummy;
while (l1 && l2) {
if (l1->val <= l2->val) { p->next = l1; l1 = l1->next; }
else { p->next = l2; l2 = l2->next; }
p = p->next;
}
p->next = l1 ? l1 : l2;
return dummy->next;
}
};
Đầu vào
[4,2,1,3,5,9,8,6,7]
Đầu ra
[1, 2, 3, 4, 5, 6, 7, 18, 19, ]