Skip to main content

Flatten a Multilevel Doubly Linked List - Solution & Explanation

MediumLinked ListDepth-First SearchDoubly-Linked List15 min readAsked at: Amazon, Microsoft, Meta +3
Practice this problem

Problem Statement

You are given a doubly linked list, which contains nodes that have a next pointer, a previous pointer, and an additional child pointer. This child pointer may or may not point to a separate doubly linked list, also containing these special nodes. These child lists may have one or more children of their own, and so on, to produce a multilevel data structure as shown in the example below.

Given the head of the first level of the list, flatten the list so that all the nodes appear in a single-level, doubly linked list. Let curr be a node with a child list. The nodes in the child list should appear after curr and before curr.next in the flattened list.

Return the head of the flattened list. The nodes in the list must have all of their child pointers set to null.

 

Example 1:

Input: head = [1,2,3,4,5,6,null,null,null,7,8,9,10,null,null,11,12]
Output: [1,2,3,7,8,11,12,9,10,4,5,6]
Explanation: The multilevel linked list in the input is shown.
After flattening the multilevel linked list it becomes:

Example 2:

Input: head = [1,2,null,3]
Output: [1,3,2]
Explanation: The multilevel linked list in the input is shown.
After flattening the multilevel linked list it becomes:

Example 3:

Input: head = []
Output: []
Explanation: There could be empty list in the input.

 

Constraints:

  • The number of Nodes will not exceed 1000.
  • 1 <= Node.val <= 105

 

How the multilevel linked list is represented in test cases:

We use the multilevel linked list from Example 1 above:

 1---2---3---4---5---6--NULL
         |
         7---8---9---10--NULL
             |
             11--12--NULL

The serialization of each level is as follows:

[1,2,3,4,5,6,null]
[7,8,9,10,null]
[11,12,null]

To serialize all levels together, we will add nulls in each level to signify no node connects to the upper node of the previous level. The serialization becomes:

[1,    2,    3, 4, 5, 6, null]
             |
[null, null, 7,    8, 9, 10, null]
                   |
[            null, 11, 12, null]

Merging the serialization of each level and removing trailing nulls we obtain:

[1,2,3,4,5,6,null,null,null,7,8,9,10,null,null,11,12]

Approach Overview

Problem Overview: You are given a doubly linked list where each node may contain a child pointer to another doubly linked list. These child lists can also have their own children, forming multiple levels. The goal is to flatten the structure so every node appears in a single-level doubly linked list following depth-first order while preserving the prev and next relationships.

Approach 1: Iterative Using Stack (O(n) time, O(n) space)

This method simulates a depth-first traversal using an explicit stack. Start from the head and iterate through the list. When you encounter a node with a child, push the current node’s next pointer onto the stack, connect the child list as the next node, and continue traversal. When the traversal reaches the end of a child chain, pop from the stack and reconnect the saved node. Each node is processed exactly once, so the time complexity is O(n), and the stack can hold up to O(n) nodes in the worst case. This approach is practical when you want predictable control over traversal without recursion.

Approach 2: Recursive Depth-First Search (O(n) time, O(d) space)

The recursive strategy performs a DFS over the multilevel structure. For each node, recursively flatten its child list before continuing to the next node. The key step is reconnecting pointers: attach the flattened child between the current node and its original next, then connect the tail of the child list back to the saved next node. The recursion naturally processes nodes in depth-first order. The algorithm runs in O(n) time because every node is visited once, while the recursion stack consumes O(d) space where d is the maximum depth of nesting.

Both solutions rely on careful pointer manipulation typical in linked list problems. The traversal itself follows a depth-first search pattern, and maintaining correct prev/next relationships is essential when working with a doubly-linked list.

Recommended for interviews: The iterative stack approach is commonly preferred because it avoids recursion limits and clearly demonstrates control over pointer updates. Showing the recursive DFS solution first can demonstrate conceptual understanding of the depth-first structure, but implementing the stack-based version often signals stronger mastery of linked list manipulation.

Approach 1: Iterative Approach Using Stack

In this approach, we utilize a stack to achieve depth-first traversal of the multilevel doubly linked list. We push nodes into the stack starting from the head, along with managing the child nodes as higher priority over next nodes. This ensures that we process all child nodes before moving on to the next nodes.

The C solution employs a stack data structure to manage the traversal of the multilevel doubly linked list. We start at the head and check if there's a child. If there is, we push the next pointer, set the child as the next node, and nullify the child. If we encounter the end of a list and have stored nodes in the stack, we pop one to continue.

Code

C

C++

Java

Python

C#

JavaScript

Complexity

Time Complexity: O(n) where n is the number of nodes. Each node is visited once.
Space Complexity: O(n) for the stack in the worst case scenario.

Try this approach in the editor →

Approach 2: Recursive Approach

This approach utilizes recursion to handle the traversing and flattening of lists. By inherently using the function call stack, it efficiently manages shifts between the parent and child lists, automatically flattening the entire structure as it recursively resolves each node and its children.

The recursive C solution uses a helper function inside the primary function to handle recursive flattening, where each call processes and flattens the child list before linking back to the parent node’s next list.

Code

C

C++

Java

Python

C#

JavaScript

Complexity

Time Complexity: O(n) due to the necessity to visit each node once.
Space Complexity: O(d) where d is the maximum depth of the children, necessitating stack space for recursion.

Try this approach in the editor →

Approach 3: Default Approach

Code

Python

Java

C++

Try this approach in the editor →

Complexity Comparison

ApproachComplexity
Iterative Approach Using Stack

Time Complexity: O(n) where n is the number of nodes. Each node is visited once.
Space Complexity: O(n) for the stack in the worst case scenario.

Recursive Approach

Time Complexity: O(n) due to the necessity to visit each node once.
Space Complexity: O(d) where d is the maximum depth of the children, necessitating stack space for recursion.

Default Approach—

Detailed Complexity Analysis

ApproachTimeSpaceWhen to Use
Iterative Using StackO(n)O(n)Preferred in interviews when you want explicit control over traversal and avoid recursion depth limits
Recursive DFSO(n)O(d)Clean and intuitive when modeling the problem as depth-first traversal of nested lists

Video Solution

Flatten a Doubly Linked List | Leetcode 430 | DSA Series by @shradhaKD • Shradha Khapra • 65,853 views views

Watch 9 more video solutions →

Frequently Asked Questions

Is Flatten a Multilevel Doubly Linked List easy or hard?
The problem is rated Medium because the traversal itself is straightforward, but pointer manipulation can easily introduce bugs. Correctly reconnecting prev, next, and child links while preserving order is the main challenge.
Flatten a Multilevel Doubly Linked List Python/Java solution
Both Python and Java implementations typically follow the same logic: iterate through nodes, attach child lists when encountered, and reconnect saved next nodes using a stack or recursion. The algorithm runs in O(n) time and works identically across C++, Java, Python, and JavaScript.
How to solve Flatten a Multilevel Doubly Linked List in O(n)?
Traverse the list using depth-first order. When a node has a child, store its next pointer, connect the child as the next node, and continue flattening the child list. After finishing the child chain, reconnect the stored next node. Using a stack or recursion ensures every node is processed once for O(n) time.
What is the best approach for Flatten a Multilevel Doubly Linked List?
The most practical approach is an iterative depth-first traversal using a stack. Each time a node with a child is found, the current next node is pushed onto the stack and the child list is attached as the next node. This processes every node once and maintains correct prev/next links, giving O(n) time complexity.
Is Flatten a Multilevel Doubly Linked List asked at Google/Amazon/Meta?
Multilevel linked list problems and pointer manipulation questions frequently appear in interviews at companies like Amazon, Meta, and Google. This problem tests understanding of depth-first traversal combined with careful doubly linked list pointer updates.
What data structure is used in Flatten a Multilevel Doubly Linked List?
The core structure is a doubly linked list where each node contains prev, next, and child pointers. Many implementations also use a stack to manage nodes that need to be revisited during depth-first traversal.
What is the time complexity of Flatten a Multilevel Doubly Linked List?
The optimal solutions run in O(n) time where n is the total number of nodes across all levels. Each node is visited and reconnected exactly once. Space complexity is O(n) for the stack-based approach or O(d) for the recursive solution where d is the maximum depth of nesting.

Ready to solve this problem?

Practice Flatten a Multilevel Doubly Linked List with our built-in code editor and test cases.

Practice on FleetCode