C++ Program For Sorting A Linked List Of 0s, 1s And 2s By Changing Links
Last Updated :
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 2s
The 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 node
Node* 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 code
int 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!
Similar Reads
C++ Program For Sorting A Linked List Of 0s, 1s And 2s Given a linked list of 0s, 1s and 2s, sort it.Examples: Input: 1 -> 1 -> 2 -> 0 -> 2 -> 0 -> 1 -> NULL Output: 0 -> 0 -> 1 -> 1 -> 1 -> 2 -> 2 -> NULL Input: 1 -> 1 -> 2 -> 1 -> 0 -> NULL Output: 0 -> 1 -> 1 -> 1 -> 2 -> NULL So
3 min read
C++ Program For Sorting An Array Of 0s, 1s and 2s Given an array A[] consisting 0s, 1s and 2s. The task is to write a function that sorts the given array. The functions should put all 0s first, then all 1s and all 2s in last.Examples: Input: {0, 1, 2, 0, 1, 2} Output: {0, 0, 1, 1, 2, 2} Input: {0, 1, 1, 0, 1, 2, 1, 2, 0, 0, 0, 1} Output: {0, 0, 0,
6 min read
C++ Program For Pairwise Swapping Elements Of A Given Linked List By Changing Links Given a singly linked list, write a function to swap elements pairwise. For example, if the linked list is 1->2->3->4->5->6->7 then the function should change it to 2->1->4->3->6->5->7, and if the linked list is 1->2->3->4->5->6 then the function sh
5 min read
C++ Program For Segregating Even And Odd Nodes In A Linked List Given a Linked List of integers, write a function to modify the linked list such that all even numbers appear before all the odd numbers in the modified linked list. Also, keep the order of even and odd numbers the same. Examples: Input: 17->15->8->12->10->5->4->1->7->6-
7 min read
C++ Program For In-Place Merge Two Linked Lists Without Changing Links Of First List Given two sorted singly linked lists having n and m elements each, merge them using constant space. First, n smallest elements in both the lists should become part of the first list and the rest elements should be part of the second list. Sorted order should be maintained. We are not allowed to chan
4 min read
C++ Program For Merge Sort For Doubly Linked List Given a doubly linked list, write a function to sort the doubly linked list in increasing order using merge sort.For example, the following doubly linked list should be changed to 24810 Recommended: Please solve it on "PRACTICE" first, before moving on to the solution. Merge sort for singly linked l
3 min read