leetcode 430 扁平化多级双向链表
z

您将获得一个双向链表,除了下一个和前一个指针之外,它还有一个子指针,可能指向单独的双向链表。这些子列表可能有一个或多个自己的子项,依此类推,生成多级数据结构,如下面的示例所示。扁平化列表,使所有结点出现在单级双链表中。您将获得列表第一级的头部。

示例:

输入:
1—2—3—4—5—6–NULL
|
7—8—9—10–NULL
|
11–12–NULL

输出:
1-2-3-7-8-11-12-9-10-4-5-6-NULL

multilevellinkedlist

multilevellinkedlistflattened


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
"""
# Definition for a Node.
class Node(object):
def __init__(self, val, prev, next, child):
self.val = val
self.prev = prev
self.next = next
self.child = child
"""
class Solution(object):
def flatten(self, head):
"""
:type head: Node
:rtype: Node
"""
if not head:
return head
pres = []
dump = Node(-1)
pre = dump
cur = None
pres.append(head)
while pres:
if not cur:
cur = pres.pop(-1)
while cur and not cur.child:
pre.next = cur
cur.prev = pre
pre = pre.next
cur = cur.next
if cur:
pre.next = cur
cur.prev = pre
pre = pre.next
if cur.next:
pres.append(cur.next)
pres.append(cur.child)
cur.child = None
cur = None
dump.next.prev = None
return dump.next

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
"""
# Definition for a Node.
class Node(object):
def __init__(self, val, prev, next, child):
self.val = val
self.prev = prev
self.next = next
self.child = child
"""
class Solution(object):
def flatten(self, head):
"""
:type head: Node
:rtype: Node
"""
if not head:
return head
stack = []
prev = None
stack.append(head)
while stack:
cur = stack.pop(-1)
if cur.next:
stack.append(cur.next)
if cur.child:
stack.append(cur.child)
cur.child = None
if prev:
prev.next = cur
cur.prev = prev
prev = prev.next
else:
prev = cur
return head