Write a function flatten() which flattens this linked list with each node down sorted link list to a single link list with all the elements in sorted order.
We have given Two methods in O(n^2) here.
for different linked list.
5 -> 7 -> 9 -> 18 | | | | 10 8 14 20 | | | | 11 8.5 19 22 | | | 12 13 24 | 15
Method 1 :
Keep Two pointers and print all elements and ie: 5,10,11,12,15,7,6,8,13 … and sort the array.
Time Complexity : O(n log n)
Method 2 :
We can Think to implement a method via which all numbers takes appropriate place in sorted order.
With Above Example.
1) Store first main list's element in Auxiliary Array
Temp[]: 5 - 7 - 9 - 18. This Temp is sorted.
2) Take first Down elements and With the divide and conquer logic
place them at appropriate position.
say 10.
- 10 > 5 , 10 <18
- divide in sub array {5,7},{9,18}
- 10 < 5, 10 > 7 10 won't come in this array part.
- 10 > 9, 10 < 18 put 10 in between
- Result set 5,7,9,10,18
3) Similarly do for all elements in fist down list
after first down link list
Result Set : 5,7,9,10,11,12,15,18.
take second list elements
say 8.
- 8 > 5 , 8 < 18
- divide {5,7,9,10} and {11,12,15,18}
- 8 > 5 , 8 < 10 & 8 < 11 ,8 < 18 => 8 won't come in this array part
- divide {5,7} {9,10}
- repeating same we can put 8 in after 5, 7 and
- Result set will be 5,7,8,10,11,12,15,18.. like wise complete all.
Time complexity O(n log n) where n is total number of elements
Method 3 : Use Merge sort – Take one first two list with 5 and 7 as head node.
– Merge and sort them in any one auxiliary list say “Result”
– and continue with Result and other lists.
– eg.Take below trace of calls to understand code
1)merge(5,7) 2)if 5 < 7 : result = 5; result->down = merge (10,7) //in next call it will return 7. // so result list will be 5-7. 3) if 10<7 : X result = 7 result->down = merge (8,10); // hence result will be 5-7-8 in next call . In next steps result will continue like this and produce sorted flatten Linked List
Code :
Node* merge( Node* a, Node* b )
{
// If first list is empty, the second list is result
if (a == NULL)
return b;
// If second list is empty, the first list is result
if (b == NULL)
return a;
// Compare the data members of head nodes of both lists
// and put the smaller one in result
Node* result;
if( a->data < b->data )
{
result = a;
result->down = merge( a->down, b );
}
else
{
result = b;
result->down = merge( a, b->down );
}
return result;
}
// The main function that flattens a given linked list
Node* flatten (Node* root)
{
// Base cases
if ( root == NULL || root->right == NULL )
return root;
// Merge this list with the list on right side
return merge( root, flatten(root->right) );
}
-IF YOU LIKE OUR EFFORT, PLEASE LIKE AND SHARE OUR FB-PAGE AND SITE