题目链接
英文链接:https://leetcode.com/problems/flatten-a-multilevel-doubly-linked-list/
中文链接:https://leetcode-cn.com/problems/flatten-a-multilevel-doubly-linked-list/
题目详述
您将获得一个双向链表,除了下一个和前一个指针之外,它还有一个子指针,可能指向单独的双向链表。这些子列表可能有一个或多个自己的子项,依此类推,生成多级数据结构,如下面的示例所示。
扁平化列表,使所有结点出现在单级双链表中。您将获得列表第一级的头部。
示例:
1 | 输入: |
以上示例的说明:
给出以下多级双向链表:

我们应该返回如下所示的扁平双向链表:

题目详解
- 题意为展开链表,规则为:记当前结点为
cur,当前结点的下一个结点为next,如果当前结点存在子链表(child != null),需要把子链表展开,并把展开后的子链表链接到cur与next之间。因为子链表可能有一个或多个自己的子项,显然展开过程是一个递归过程。 - 保证展开后的链表的每个结点的
prev、next、child这三个指针的指向是正确的。prev指向上一个结点(如果当前结点为头结点,prev指向null)。next指向下一个结点(如果当前结点为尾结点,next指向null)。child指向null(链表已经展开了)。
- 在链接
cur、next、子链表三者时,需要用到子链表的头结点和尾结点。可以让展开方法的返回值为展开后链表的头结点,并且让头结点的prev指向尾结点(头结点的prev原本指向null,进行废物利用),这样就可以通过一个返回值得到头结点和尾结点两个信息,最后进行还原即可。 - 每个结点只会访问一次,时间复杂度为
O(n),空间复杂度主要源于递归调用,即这个多级链表的最大层数。
1 | public class LeetCode_00430 { |