Flatten a Multilevel Doubly Linked List (M)
题目
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;
}
}