1. Brute Force — Preorder DFS Collect into Vector & Rebuild
Intuition
Traverse the multilevel list recursively: visit the node, recursively visit its child branch, then recursively visit its next branch. Collect all visited nodes in order, then rewrite their prev, next, and child pointers.
Algorithm
- Step 1: Define a recursive helper
dfs(node, list)that appendsnode, then callsdfs(node.child, list), then callsdfs(node.next, list). - Step 2: Collect all nodes into an array
nodes. - Step 3: Iterate
ifrom0tonodes.length - 1: setnodes[i].child = null,nodes[i].next = nodes[i+1](if exists), andnodes[i+1].prev = nodes[i]. - Step 4: Return
nodes[0].
#include <iostream>#include <vector> using namespace std; class Node {public: int val; Node* prev; Node* next; Node* child; Node(int v) : val(v), prev(nullptr), next(nullptr), child(nullptr) {}}; class Solution { void dfs(Node* node, vector<Node*>& order) { if (!node) return; order.push_back(node); dfs(node->child, order); dfs(node->next, order); }public: Node* flatten(Node* head) { if (!head) return nullptr; vector<Node*> order; dfs(head, order); for (int i = 0; i < (int)order.size(); ++i) { order[i]->child = nullptr; order[i]->prev = (i > 0) ? order[i - 1] : nullptr; order[i]->next = (i + 1 < (int)order.size()) ? order[i + 1] : nullptr; } return order[0]; }}; int main() { Node* n1 = new Node(1); Node* n2 = new Node(2); Node* n3 = new Node(3); n1->next = n2; n2->prev = n1; n1->child = n3; Solution sol; Node* flat = sol.flatten(n1); cout << "Brute Force Flat: "; for (Node* c = flat; c; c = c->next) { cout << c->val << (c->next ? " <-> " : ""); } cout << endl; return 0;}Time & Space Complexity
- Time complexity:
O(N)— Traverses all N nodes in preorder DFS to store them in a buffer, then performs a second pass of N iterations to rebuild links. - Space complexity:
O(N)— Allocates a dynamic array/vector storing N node pointers.
Why Brute Force Doesn't Scale:
Array reconstruction uses O(N) auxiliary space which triggers garbage collection overhead on large datasets.
For 1,000,000 nodes, in-place splicing requires 0 bytes extra heap, while array collection allocates ~8MB memory.