LeetCode 430. Flatten a Multilevel Doubly Linked List
本题和 LeetCode 114. Flatten Binary Tree to Linked List 一模一样。doubly linked list 稍微复杂一点。
Recursive
PreOrder
和LC114一样,preorder来写的时候要copy next的指针。下面写法同时copy了child和next,是的思路更加简洁。
class Solution { public: Node *prev=NULL; Node* flatten(Node* head) { if (head==NULL) return NULL; Node *child=head->child, *next=head->next; if (prev!=NULL){ prev->next = head; head->prev = prev; prev->child = NULL; } prev = head; flatten(child); flatten(next); return head; } };
PostOrder
(head, child, next) 反一反就是 (next, child, head),用postorder递归来做。
class Solution { public: Node *first=NULL; Node* flatten(Node* head) { if (head==NULL) return NULL; flatten(head->next); flatten(head->child); head->next = first; head->child = NULL; if (first!=NULL) first->prev = head; first = head; return first; } };
如果不用全局变量,那么dfs函数需要一个参数记录first,https://leetcode.com/problems/flatten-a-multilevel-doubly-linked-list/discuss/295912/C++-Simple-5-line-recursive-solution-(with-diagram)
Iterative
PreOrder
class Solution { public: Node* flatten(Node* head) { if (head==NULL) return NULL; Node *prev=NULL; stack<Node *> s({head}); while (!s.empty()){ Node *cur=s.top(); s.pop(); if (prev!=NULL){ prev->next = cur; prev->child = NULL; cur->prev = prev; } prev = cur; if (cur->next) s.push(cur->next); if (cur->child) s.push(cur->child); } return head; } };
Without Stack
class Solution { public: Node* flatten(Node* head) { Node *p=head; while (p){ if (p->child){ Node *q=p->child; while (q->next) q=q->next; q->next = p->next; if (p->next) p->next->prev = q; p->next = p->child; p->child->prev = p; p->child = NULL; } p = p->next; } return head; } };
Reference
Recursive PreOrder / PostOrder
Easy-Understand-Java-Recursive-solution-beat-100-with-Explanation
Java-pre-order-and-post-order-solution-same-idea-with-114.-Flatten-Binary-Tree-to-Linked-List
Java-Recursive-Solution-Beats-100-Similar-to-Flatten-Binary-Tree-to-LinkedList
Iterative PreOrder Simple-Java-Pre-Order-Solution
Iterative Without Stack c++-about-10-lines-solution