मान लीजिए हमारे पास एक लिंक्ड लिस्ट है। हमें इसे O(n log n) समय और कॉन्स्टेंट स्पेस कॉम्प्लेक्सिटी में सॉर्ट करना है।
उदाहरण: [4,2,1,3] → [1,2,3,4]।
मर्ज सॉर्ट (टॉप-डाउन)
- दो सॉर्टेड लिस्ट्स को मर्ज करने के लिए
merge(l1, l2)फंक्शन। sortList(head):- यदि हेड null है या केवल एक नोड है, तो हेड लौटाएँ।
- स्लो और फास्ट पॉइंटर्स से मध्य ढूंढें।
prev->next = nullसे लिस्ट को दो भागों में बाँटें।l1 = sortList(head),l2 = sortList(slow)।return merge(l1, l2)।
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;
}
};
int main() {
// लिस्ट बनाने और टेस्ट करने का कोड
return 0;
}
इनपुट
[4,2,1,3,5,9,8,6,7]
आउटपुट
[1, 2, 3, 4, 5, 6, 7, 18, 19, ]