返回介绍

solution / 0400-0499 / 0430.Flatten a Multilevel Doubly Linked List / README

发布于 2024-06-17 01:04:00 字数 5000 浏览 0 评论 0 收藏 0

430. 扁平化多级双向链表

English Version

题目描述

你会得到一个双链表,其中包含的节点有一个下一个指针、一个前一个指针和一个额外的 子指针 。这个子指针可能指向一个单独的双向链表,也包含这些特殊的节点。这些子列表可以有一个或多个自己的子列表,以此类推,以生成如下面的示例所示的 多层数据结构

给定链表的头节点 head ,将链表 扁平化 ,以便所有节点都出现在单层双链表中。让 curr 是一个带有子列表的节点。子列表中的节点应该出现在扁平化列表中的 curr 之后 和 curr.next 之前

返回 _扁平列表的 head 。列表中的节点必须将其 所有 子指针设置为 null 。_

 

示例 1:

输入:head = [1,2,3,4,5,6,null,null,null,7,8,9,10,null,null,11,12]
输出:[1,2,3,7,8,11,12,9,10,4,5,6]
解释:输入的多级列表如上图所示。
扁平化后的链表如下图:

示例 2:

输入:head = [1,2,null,3]
输出:[1,3,2]
解释:输入的多级列表如上图所示。
扁平化后的链表如下图:

示例 3:

输入:head = []
输出:[]
说明:输入中可能存在空列表。

 

提示:

  • 节点数目不超过 1000
  • 1 <= Node.val <= 105

 

如何表示测试用例中的多级链表?

示例 1 为例:

 1---2---3---4---5---6--NULL
     |
     7---8---9---10--NULL
       |
       11--12--NULL

序列化其中的每一级之后:

[1,2,3,4,5,6,null]
[7,8,9,10,null]
[11,12,null]

为了将每一级都序列化到一起,我们需要每一级中添加值为 null 的元素,以表示没有节点连接到上一级的上级节点。

[1,2,3,4,5,6,null]
[null,null,7,8,9,10,null]
[null,11,12,null]

合并所有序列化结果,并去除末尾的 null 。

[1,2,3,4,5,6,null,null,null,7,8,9,10,null,null,11,12]

    解法

    方法一

    """
    # Definition for a Node.
    class Node:
      def __init__(self, val, prev, next, child):
        self.val = val
        self.prev = prev
        self.next = next
        self.child = child
    """
    
    
    class Solution:
      def flatten(self, head: 'Node') -> 'Node':
        def preorder(pre, cur):
          if cur is None:
            return pre
          cur.prev = pre
          pre.next = cur
    
          t = cur.next
          tail = preorder(cur, cur.child)
          cur.child = None
          return preorder(tail, t)
    
        if head is None:
          return None
        dummy = Node(0, None, head, None)
        preorder(dummy, head)
        dummy.next.prev = None
        return dummy.next
    
    /*
    // 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) {
        if (head == null) {
          return null;
        }
        Node dummy = new Node();
        dummy.next = head;
        preorder(dummy, head);
        dummy.next.prev = null;
        return dummy.next;
      }
    
      private Node preorder(Node pre, Node cur) {
        if (cur == null) {
          return pre;
        }
        cur.prev = pre;
        pre.next = cur;
    
        Node t = cur.next;
        Node tail = preorder(cur, cur.child);
        cur.child = null;
        return preorder(tail, t);
      }
    }
    
    /*
    // Definition for a Node.
    class Node {
    public:
      int val;
      Node* prev;
      Node* next;
      Node* child;
    };
    */
    
    class Solution {
    public:
      Node* flatten(Node* head) {
        flattenGetTail(head);
        return head;
      }
    
      Node* flattenGetTail(Node* head) {
        Node* cur = head;
        Node* tail = nullptr;
    
        while (cur) {
          Node* next = cur->next;
          if (cur->child) {
            Node* child = cur->child;
            Node* childTail = flattenGetTail(cur->child);
    
            cur->child = nullptr;
            cur->next = child;
            child->prev = cur;
            childTail->next = next;
    
            if (next)
              next->prev = childTail;
    
            tail = childTail;
          } else {
            tail = cur;
          }
    
          cur = next;
        }
    
        return tail;
      }
    };
    

    如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

    扫码二维码加入Web技术交流群

    发布评论

    需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
    列表为空,暂无数据
      我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
      原文