C++ Program For Sorting A Linked List Of 0s, 1s And 2s By Changing Links - GeeksforGeeks

11 Jan, 2022
Given a linked list of 0s, 1s and 2s, sort it.Examples:
Input: 2->1->2->1->1->2->0->1->0
Output: 0->0->1->1->1->1->2->2->2
The sorted Array is 0, 0, 1, 1, 1, 1, 2, 2, 2.

Input: 2->1->0
Output: 0->1->2
The sorted Array is 0, 1, 2
Method 1: There is a solution discussed in below post that works by changing data of nodes. Sort a linked list of 0s, 1s and 2sThe above solution does not work when these values have associated data with them. For example, these three represent three colors and different types of objects associated with the colors and sort the objects (connected with a linked list) based on colors.
Method 2: In this post, a new solution is discussed that works by changing links.Approach: Iterate through the linked list. Maintain 3 pointers named zero, one, and two to point to current ending nodes of linked lists containing 0, 1, and 2 respectively. For every traversed node, we attach it to the end of its corresponding list. Finally, we link all three lists. To avoid many null checks, we use three dummy pointers zeroD, oneD, and twoD that work as dummy headers of three lists.
C++
// C++ Program to sort a linked list // 0s, 1s or 2s by changing links#include <bits/stdc++.h>  // Link list node struct Node {    int data;    struct Node* next;};  Node* newNode(int data);  // Sort a linked list of 0s, 1s // and 2s by changing pointers.Node* sortList(Node* head){    if (!head || !(head->next))        return head;      // Create three dummy nodes to point     // to beginning of three linked lists.     // These dummy nodes are created to     // avoid many null checks.    Node* zeroD = newNode(0);    Node* oneD = newNode(0);    Node* twoD = newNode(0);      // Initialize current pointers for     // three lists and whole list.    Node* zero = zeroD, *one = oneD,         *two = twoD;      // Traverse list    Node* curr = head;    while (curr)     {        if (curr->data == 0)         {            zero->next = curr;            zero = zero->next;            curr = curr->next;        }        else if (curr->data == 1)        {            one->next = curr;            one = one->next;            curr = curr->next;        }        else         {            two->next = curr;            two = two->next;            curr = curr->next;        }    }      // Attach three lists    zero->next = (oneD->next) ?                  (oneD->next) : (twoD->next);    one->next = twoD->next;    two->next = NULL;      // Updated head    head = zeroD->next;      // Delete dummy nodes    delete zeroD;    delete oneD;    delete twoD;      return head;}  // Function to create and return a nodeNode* newNode(int data){    // Allocating space    Node* newNode = new Node;      // Inserting the required data    newNode->data = data;    newNode->next = NULL;}  // Function to print linked list void printList(struct Node* node){    while (node != NULL)    {        printf("%d  ", node->data);        node = node->next;    }    printf("");}  // Driver codeint main(void){    // Creating the list 1->2->4->5    Node* head = newNode(1);    head->next = newNode(2);    head->next->next = newNode(0);    head->next->next->next = newNode(1);      printf("Linked List Before Sorting");    printList(head);      head = sortList(head);      printf("Linked List After Sorting");    printList(head);      return 0;}
Output : 
Linked List Before Sorting
1  2  0  1  
Linked List After Sorting
0  1  1  2  
Complexity Analysis: 
Time Complexity: O(n) where n is a number of nodes in linked list. Only one traversal of the linked list is needed.
Auxiliary Space: O(1). As no extra space is required.
Please refer complete article on Sort a linked list of 0s, 1s and 2s by changing links for more details!
Amazon
Linked-List-Sorting
MakeMyTrip
Microsoft
C++ Programs
Linked List
Sorting
Amazon
Microsoft
MakeMyTrip
Linked List
Sorting
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Comments
Old Comments
Passing a function as a parameter in C++
Program to implement Singly Linked List in C++ using class
Const keyword in C++
cout in C++
Handling the Divide by Zero Exception in C++
Linked List | Set 1 (Introduction)
Linked List | Set 2 (Inserting a node)
Reverse a linked list
Stack Data Structure (Introduction and Program)
Linked List | Set 3 (Deleting a node)