Skip to content

Latest commit

 

History

History
189 lines (161 loc) · 5.12 KB

430. Flatten a Multilevel Doubly Linked List.md

File metadata and controls

189 lines (161 loc) · 5.12 KB

Difficulty : Medium

Related Topics : LinkedListDFS


leetcode Daily Challenge on July 10th, 2020.


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:

Example1

After flattening the multilevel linked list it becomes: Example1 res

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

Solution

  • Java
    • mine
      • Recursive Runtime: 1 ms, faster than 14.60%, Memory Usage: 37.3 MB, less than 85.00% of Java online submissions

        //O(N)time
        //O(1)space
        public Node flatten(Node head) {
            if (head == null) {
                return head;
            }
            Node res = new Node();
            Node t = res;
            Node next;
            while (head != null) {
                next = head.next;
                Node child = head.child;
                head.child = null;
                head.next = null;
                t.next = head;
                t.next.prev = t;
                t = t.next;
                if (child != null) {
                    Node cRes = flatten(child);
                    t.next = cRes;
                    cRes.prev = t;
                    while (t.next != null) {
                        t = t.next;
                    }
                }
                head = next;
            }
            res.next.prev = null;
            return res.next;
        }
        
      • DFS Runtime: 0 ms, faster than 100.00%, Memory Usage: 37.3 MB, less than 89.09% of Java online submissions

        // O(N)time 
        // O(C)space  C is the count of node has child
        public Node flatten(Node head) {
            LinkedList<Node> list = new LinkedList<>();
            Node res = head;
            Node t = res;
            while (t != null) {
                if (t.child != null) {
                    if (t.next != null) {
                        list.add(t.next);
                    }
                    t.child.prev = t;
                    t.next = t.child;
                    t.child = null;
                } else {
                    if (t.next == null) {
                        if (list.isEmpty()) {
                            break;
                        }
                        t.next = list.removeLast();
                    }
                    t.next.prev = t;
                }
                t = t.next;
            }
            return res;
        }
        

  • the most votes

    • Runtime: 0 ms, faster than 100.00%, Memory Usage: 37.7 MB, less than 75.00% of Java online submissions
      // O(N)time 
      // O(1)space
      public Node flatten(Node head) {
          if (head == null) return head;
          // Pointer
          Node p = head;
          while (p != null) {
              /* CASE 1: if no child, proceed */
              if (p.child == null) {
                  p = p.next;
                  continue;
              }
              /* CASE 2: got child, find the tail of the child and link it to p.next */
              Node temp = p.child;
              // Find the tail of the child
              while (temp.next != null)
                  temp = temp.next;
              // Connect tail with p.next, if it is not null
              temp.next = p.next;
              if (p.next != null) p.next.prev = temp;
              // Connect p with p.child, and remove p.child
              p.next = p.child;
              p.child.prev = p;
              p.child = null;
          }
          return head;
      }