Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

C++ में लिंक्ड लिस्ट सॉर्ट करना


मान लीजिए हमारे पास एक लिंक्ड लिस्ट है। हमें इसे O(n log n) समय और कॉन्स्टेंट स्पेस कॉम्प्लेक्सिटी में सॉर्ट करना है।

उदाहरण: [4,2,1,3] → [1,2,3,4]।

मर्ज सॉर्ट (टॉप-डाउन)

  1. दो सॉर्टेड लिस्ट्स को मर्ज करने के लिए merge(l1, l2) फंक्शन।
  2. 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, ]
  1. - C में qsort() और C++ में sort() की तुलना

    C की qsort और C++ की std::sort दोनों सॉर्टिंग फंक्शन्स हैं, लेकिन डिज़ाइन, प्रदर्शन और सुरक्षा में महत्वपूर्ण अंतर हैं। फंक्शन सिग्नेचर्स // C qsort void qsort(void *base, size_t num, size_t size, int (*compar)(const void*, const void*)); // C++ std::sort template <class RandomIt, c

  1. - C++ में अगला छोटा तत्व

    अगला छोटा तत्व वह तत्व है जो उसके बाद पहला छोटा तत्व है। आइए एक उदाहरण देखते हैं। arr = [1, 2, 3, 5, 4] 5 के लिए अगला छोटा तत्व 4 है और तत्वों 1, 2, 3 के लिए अगला छोटा तत्व -1 है क्योंकि उनके बाद कोई छोटा तत्व नहीं है। एल्गोरिदम सरणी को यादृच्छिक संख्याओं से आरंभ करें। एक स्टैक आरंभ करें। पहला तत

  1. C++ में रैंडम पॉइंटर के साथ लिस्ट कॉपी करें C++ में रैंडम पॉइंटर के साथ लिस्ट कॉपी करें

    लिंक्ड लिस्ट एक रैखिक डेटा संरचना है जिसमें प्रत्येक नोड के दो ब्लॉक होते हैं जैसे कि एक ब्लॉक में नोड का मान या डेटा होता है और दूसरा ब्लॉक अगले फील्ड का पता रखता है। मान लीजिए हमारे पास एक लिंक्ड लिस्ट है जैसे कि प्रत्येक नोड में एक रैंडम पॉइंटर होता है जो लिस्ट में अन्य नोड्स की ओर इंगित करता है।