Open In App
Related Articles

Flatten a multi-level linked list | Set 2 (Depth wise)

Improve Article
Improve
Save Article
Save
Like Article
Like

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;
}
 
// This code contributed by aashish1995


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
 
# This code is contributed by rutvik_56


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;
}
 
 
// This code is contributed by aashish1995


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;
    }
// This code contributed by aashish1995
</script>


Time Complexity : O(n)

Space Complexity : O(m)

If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.
 


Feeling lost in the world of random DSA topics, wasting time without progress? It's time for a change! Join our DSA course, where we'll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 geeks!

Last Updated : 12 Apr, 2023
Like Article
Save Article
Similar Reads
Related Tutorials