• 0430. Flatten a Multilevel Doubly Linked List (M)


    Flatten a Multilevel Doubly Linked List (M)

    题目

    You are given a doubly linked list which in addition to the next and previous pointers, it could have a child pointer, which may or may not point to a separate doubly linked list. These child lists may have one or more children of their own, and so on, to produce a multilevel data structure, as shown in the example below.

    Flatten the list so that all the nodes appear in a single-level, doubly linked list. You are given the head of the first level of the list.

    Example 1:

    Input: head = [1,2,3,4,5,6,null,null,null,7,8,9,10,null,null,11,12]
    Output: [1,2,3,7,8,11,12,9,10,4,5,6]
    Explanation:
    
    The multilevel linked list in the input is as follows:
    
    
    
    After flattening the multilevel linked list it becomes:
    

    Example 2:

    Input: head = [1,2,null,3]
    Output: [1,3,2]
    Explanation:
    
    The input multilevel linked list is as follows:
    
      1---2---NULL
      |
      3---NULL
    

    Example 3:

    Input: head = []
    Output: []
    

    How multilevel linked list is represented in test case:

    We use the multilevel linked list from Example 1 above:

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

    The serialization of each level is as follows:

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

    To serialize all levels together we will add nulls in each level to signify no node connects to the upper node of the previous level. The serialization becomes:

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

    Merging the serialization of each level and removing trailing nulls we obtain:

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

    Constraints:

    • Number of Nodes will not exceed 1000.
    • 1 <= Node.val <= 10^5

    题意

    给双向链表多加一个指针域child,指向下一层的链表。要求将给定的多层链表压平成一个链表。

    思路

    DFS处理,从下往上合并每一层;也可以直接用迭代从上往下合并每一层。


    代码实现

    Java

    递归

    class Solution {
        public Node flatten(Node head) {
            dfs(head);
            return head;
        }
    
      	// dfs返回压平后的当前链表的尾结点
        private Node dfs(Node head) {
            Node p = head;
            Node last = null;
            while (p != null) {
                if (p.next == null) {
                    last = p;
                }
                if (p.child != null) {
                    Node childLast = dfs(p.child);
                    Node next = p.next;
                    p.next = p.child;
                    p.child.prev = p;
                    p.child = null;
                    childLast.next = next;
                    if (next != null) {
                        next.prev = childLast;
                    }
                    p = childLast;
                } else {
                    p = p.next;
                }
            }
            return last;
        }
    }
    

    迭代

    class Solution {
        public Node flatten(Node head) {
            Node p = head;
            while (p != null) {
                Node next = p.next;
                if (p.child != null) {
                    Node q = p.child;
                    while (q.next != null) {
                        q = q.next;
                    }
                    p.next = p.child;
                    p.child.prev = p;
                    p.child = null;
                    q.next = next;
                    if (next != null) {
                        next.prev = q;
                    }
                }
                p = p.next;
            }
            return head;
        }
    }
    
  • 相关阅读:
    Vue 事件修饰符 阻止默认事件
    vue created 生命周期
    续集---网络管理常用命令
    网络管理常用命令(6/14) -netstat命令详解
    系统OOM复位定位
    nohup- Shell后台运行
    一个linux命令(6/13):traceroute命令
    一个linux命令(6/12):cat 命令
    linux命令(6/11)--修改文件的用户组chgrp和文件所有者chown
    Linux终端快捷键
  • 原文地址:https://www.cnblogs.com/mapoos/p/13282185.html
Copyright © 2020-2023  润新知