LeetCode 430 扁平化多级双向链表[递归 栈] HERODING的LeetCode之路
Posted HERODING23
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 430 扁平化多级双向链表[递归 栈] HERODING的LeetCode之路相关的知识,希望对你有一定的参考价值。
### 解题思路1:栈方法
遇到这种有“深度”的题目自然会联想到递归,这里有两个思路,第一个就是用栈的形式存储,首先循环条件是节点不为空,每次遇到有孩子的节点,如果该节点的next不为空就放入栈中,接着把孩子连到next中,当遍历到节点的next为空了,看看栈中有无节点,有就接上去,接着遍历,代码如下:
/*
// Definition for a Node.
class Node {
public:
int val;
Node* prev;
Node* next;
Node* child;
};
*/
class Solution {
public:
Node* flatten(Node* head) {
Node* node = head;
stack<Node*> s;
while(node != nullptr) {
// 孩子不为空
if(node -> child != nullptr) {
if(node -> next != nullptr) {
s.push(node -> next);
}
Node* child = node -> child;
// 扁平化
node -> next = child;
child -> prev = node;
// 孩子要去掉
node -> child = nullptr;
}
if(node -> next == nullptr && !s.empty()) {
Node* next = s.top();
s.pop();
node -> next = next;
next -> prev = node;
}
node = node -> next;
}
return head;
}
};
解题思路2:递归
递归的方式就更好理解了,循环条件也是节点不为空,如果遇到节点有孩子,就保存next节点并把孩子接上,接着把孩子的子链过滤到头,再把头和保存的next节点连接即可,代码如下:
/*
// Definition for a Node.
class Node {
public:
int val;
Node* prev;
Node* next;
Node* child;
};
*/
class Solution {
public:
Node* flatten(Node* head) {
if(head == nullptr) return nullptr;
Node* node = head;
while(node != nullptr) {
// 孩子不为空
if(node -> child != nullptr) {
Node* next = node -> next;
Node* child = flatten(node -> child);
// 扁平化
node -> next = child;
child -> prev = node;
// 孩子要去掉
node -> child = nullptr;
if(next != nullptr) {
// 遍历到当前扁平化的尾部
while(node -> next != nullptr) {
node = node -> next;
}
// 和之前的next连接
node -> next = next;
next -> prev = node;
}
}
node = node -> next;
}
return head;
}
};
以上是关于LeetCode 430 扁平化多级双向链表[递归 栈] HERODING的LeetCode之路的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode - 430 - 扁平化多级双向链表 - Java - 细喔
LeetCode 430. 扁平化多级双向链表 / 583. 两个字符串的删除操作 / 478. 在圆内随机生成点(拒绝采样圆形面积推导)