题目
You are given a doubly linked list which in addition to the next and previous pointers, it could have a child pointer, which may or may not point to a separate doubly linked list. 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.
Flatten the list so that all the nodes appear in a single-level, doubly linked list. You are given the head of the first level of the list.
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 as follows:After flattening the multilevel linked list it becomes:
Example 2:
Input: head = [1,2,null,3]Output: [1,3,2]Explanation:The input multilevel linked list is as follows:1---2---NULL|3---NULL
Example 3:
Input: head = []Output: []
How multilevel linked list is represented in test case:
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]
Constraints:
- Number of Nodes will not exceed 1000.
1 <= Node.val <= 10^5
题意
给双向链表多加一个指针域child,指向下一层的链表。要求将给定的多层链表压平成一个链表。
思路
DFS处理,从下往上合并每一层;也可以直接用迭代从上往下合并每一层。
代码实现
Java
递归
class Solution {public Node flatten(Node head) {dfs(head);return head;}// dfs返回压平后的当前链表的尾结点private Node dfs(Node head) {Node p = head;Node last = null;while (p != null) {if (p.next == null) {last = p;}if (p.child != null) {Node childLast = dfs(p.child);Node next = p.next;p.next = p.child;p.child.prev = p;p.child = null;childLast.next = next;if (next != null) {next.prev = childLast;}p = childLast;} else {p = p.next;}}return last;}}
迭代
class Solution {public Node flatten(Node head) {Node p = head;while (p != null) {Node next = p.next;if (p.child != null) {Node q = p.child;while (q.next != null) {q = q.next;}p.next = p.child;p.child.prev = p;p.child = null;q.next = next;if (next != null) {next.prev = q;}}p = p.next;}return head;}}
