Flatten a multi-level linked list | Set 2 (Depth wise)
Last Updated :
12 Apr, 2023
We have discussed flattening of a multi-level linked list where nodes have two pointers down and next. In the previous post, we flattened the linked list level-wise. How to flatten a linked list when we always need to process the down pointer before next at every node.
Input:
1 - 2 - 3 - 4
|
7 - 8 - 10 - 12
| | |
9 16 11
| |
14 17 - 18 - 19 - 20
| |
15 - 23 21
|
24
Output:
Linked List to be flattened to
1 - 2 - 7 - 9 - 14 - 15 - 23 - 24 - 8
- 16 - 17 - 18 - 19 - 20 - 21 - 10 -
11 - 12 - 3 - 4
Note : 9 appears before 8 (When we are
at a node, we process down pointer before
right pointer)
Source: Oracle Interview
If we take a closer look, we can notice that this problem is similar to tree to linked list conversion. We recursively flatten a linked list with the following steps.
1) If the node is NULL, return NULL.
2) Store the next node of the current node (used in step 4).
3) Recursively flatten down the list. While flattening, keep track of the last visited node, so that the next list can be linked after it.
4) Recursively flatten the next list (we get the next list from the pointer stored in step 2) and attach it after the last visited node.
Below is the implementation of the above idea.
Code block
Output:
1 2 7 9 14 15 23 24 8 16 17 18 19 20 21 10 11 12 3 4
Alternate implementation using the stack data structure
C++
Node* flattenList2(Node* head)
{
Node* headcop = head;
stack<Node*> save;
save.push(head);
Node* prev = NULL;
while (!save.empty()) {
Node* temp = save.top();
save.pop();
if (temp->next)
save.push(temp->next);
if (temp->down)
save.push(temp->down);
if (prev != NULL)
prev->next = temp;
prev = temp;
}
return headcop;
}
|
Java
Node flattenList2(Node head)
{
Node headcop = head;
Stack<Node> save = new Stack<>();
save.push(head);
Node prev = null ;
while (!save.isEmpty()) {
Node temp = save.peek();
save.pop();
if (temp.next)
save.push(temp.next);
if (temp.down)
save.push(temp.down);
if (prev != null )
prev.next = temp;
prev = temp;
}
return headcop;
}
|
Python3
def flattenList2(head):
headcop = head
save = []
save.append(head)
prev = None
while ( len (save) ! = 0 ):
temp = save[ - 1 ]
save.pop()
if (temp. next ):
save.append(temp. next )
if (temp.down):
save.append(temp.down)
if (prev ! = None ):
prev. next = temp
prev = temp
return headcop
|
C#
Node flattenList2(Node head)
{
Node headcop = head;
Stack<Node> save = new Stack<Node>();
save.Push(head);
Node prev = null ;
while (!save.Count != 0)
{
Node temp = save.Peek();
save.Pop();
if (temp.next)
save.Push(temp.next);
if (temp.down)
save.Push(temp.down);
if (prev != null )
prev.next = temp;
prev = temp;
}
return headcop;
}
|
Javascript
<script>
function flattenList2(head)
{
var headcop = head;
var save = new Stack();
save.push(head);
var prev = null ;
while (!save.isEmpty()) {
var temp = save.pop();
if (temp.next)
save.push(temp.next);
if (temp.down)
save.push(temp.down);
if (prev != null )
prev.next = temp;
prev = temp;
}
return headcop;
}
</script>
|
Time Complexity : O(n)
Space Complexity : O(m)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...