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

C++ में लिंक्ड लिस्ट के लिए मर्ज सॉर्ट

समस्या कथन

एक लिंक्ड लिस्ट दी गई है। इसे मर्ज सॉर्ट एल्गोरिदम का उपयोग करके सॉर्ट करें।

List: 10→20→8→17→5→13→4
Sorted list: 4→5→8→10→13→17→20

एल्गोरिदम

1. यदि हेड NULL है या लिस्ट में केवल एक तत्व है तो लिस्ट लौटाएं
2. मूल लिस्ट को 2 भागों में विभाजित करके दो लिस्ट बनाएं
3. लिस्ट के पहले और दूसरे भाग को सॉर्ट करें
4. दोनों सॉर्ट की गई लिस्ट को मर्ज करें

C++ उदाहरण

#include <iostream>
#include <new>
#define SIZE(arr) (sizeof(arr) / sizeof(arr[0]))
using namespace std;

struct Node {
    int data;
    struct Node *next;
};

Node* createList(int *arr, int n) {
    Node *head, *p;
    p = head = new Node;
    head->data = arr[0];
    head->next = NULL;
    for (int i = 1; i < n; ++i) {
        p->next = new Node;
        p = p->next;
        p->data = arr[i];
        p->next = NULL;
    }
    return head;
}

void displayList(Node *head) {
    while (head != NULL) {
        cout << head->data << " ";
        head = head->next;
    }
    cout << endl;
}

Node* mergeSortedLists(Node *head1, Node *head2) {
    if (!head1) return head2;
    if (!head2) return head1;
    Node *result = NULL;
    if (head1->data < head2->data) {
        result = head1;
        result->next = mergeSortedLists(head1->next, head2);
    } else {
        result = head2;
        result->next = mergeSortedLists(head1, head2->next);
    }
    return result;
}

void splitList(Node *src, Node **fRef, Node **bRef) {
    Node *fast = src->next, *slow = src;
    while (fast != NULL) {
        fast = fast->next;
        if (fast != NULL) {
            slow = slow->next;
            fast = fast->next;
        }
    }
    *fRef = src;
    *bRef = slow->next;
    slow->next = NULL;
}

void mergeSort(Node **head) {
    Node *p = *head, *a = NULL, *b = NULL;
    if (!p || !p->next) return;
    splitList(p, &a, &b);
    mergeSort(&a);
    mergeSort(&b);
    *head = mergeSortedLists(a, b);
}

int main() {
    int arr[] = {10, 20, 8, 17, 5, 13, 4};
    Node *head = createList(arr, SIZE(arr));
    cout << "Unsorted list: " << endl;
    displayList(head);
    mergeSort(&head);
    cout << "Final sorted list: " << endl;
    displayList(head);
    return 0;
}

आउटपुट

Unsorted list: 10 20 8 17 5 13 4
Final sorted list: 4 5 8 10 13 17 20
  1. C++ में मल्टीलेवल लिंक्ड सूची को समतल करना C++ में मल्टीलेवल लिंक्ड सूची को समतल करना

    इस समस्या में, हमें एक मल्टीलेवल लिंक्ड सूची दी गई है। हमारा कार्य मल्टीलेवल लिंक्ड सूची को समतल करने के लिए एक प्रोग्राम बनाना है। समतल करने का ऑपरेशन इस तरह से किया जाता है कि पहले स्तर के नोड्स पहले लिंक्ड सूची में आएंगे और फिर दूसरे स्तर के नोड्स आएंगे। मल्टीलेवल लिंक्ड सूची एक बहुआयामी डेटा संर

  1. C++ में दो लिंक्ड लिस्ट का इंटरसेक्शन C++ में दो लिंक्ड लिस्ट का इंटरसेक्शन

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

  1. C++ में डबल लिंक्ड सर्कुलर सूचियाँ C++ में डबल लिंक्ड सर्कुलर सूचियाँ

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