0430. 扁平化多级双向链表
文章目录
- 题目链接
- 题目描述
- 推荐写法(返回尾节点,整体 O(n))
- 复杂度分析
题目链接
https://leetcode.cn/problems/flatten-a-multilevel-doubly-linked-list/
题目描述
将多级双向链表扁平化:把每个节点的 child 子链表插入到该节点与其 next 之间,最终得到单层双向链表,所有 child 置为 null。
推荐写法(返回尾节点,整体 O(n))
/*
// Definition for a Node.
class Node {public int val;public Node prev;public Node next;public Node child;
}
*/
class Solution {public Node flatten(Node head) {flattenTail(head);return head;}// 扁平化以 head 为首的链表,返回该段扁平化后的尾节点private Node flattenTail(Node head) {Node cur = head;Node last = head; // 记录当前已扁平段的尾while (cur != null) {Node next = cur.next;if (cur.child != null) {// 先把 child 段扁平化,得到其尾节点 childTailNode childHead = cur.child;Node childTail = flattenTail(childHead);// 将 child 段插入 cur 与 next 之间cur.next = childHead;childHead.prev = cur;cur.child = null;// 接回 nextif (next != null) {childTail.next = next;next.prev = childTail;}// 更新 last,并从 childTail 继续last = childTail;cur = next;} else {last = cur;cur = next;}}return last;}
}
复杂度分析
- 时间复杂度:O(n),每个节点仅被访问和重连常数次。
- 空间复杂度:O(d),d 为最大嵌套深度(递归栈);可改迭代+显式栈降为 O(h) 显式空间。
