Watch 10 video solutions for Flatten a Multilevel Doubly Linked List, a medium level problem involving Linked List, Depth-First Search, Doubly-Linked List. This walkthrough by Shradha Khapra has 53,325 views views. Want to try solving it yourself? Practice on FleetCode or read the detailed text solution.
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:
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]
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 | Time | Space | When to Use |
|---|---|---|---|
| Iterative Using Stack | O(n) | O(n) | Preferred in interviews when you want explicit control over traversal and avoid recursion depth limits |
| Recursive DFS | O(n) | O(d) | Clean and intuitive when modeling the problem as depth-first traversal of nested lists |