iT邦幫忙

2023 iThome 鐵人賽

DAY 22
0
自我挑戰組

非資工本科的Leetcode刷題筆記系列 第 22

Day22 - Linked List - Conclusion Problem 4

  • 分享至 

  • xImage
  •  

138. Copy List with Random Pointer

題目

A linked list of length n is given such that each node contains an additional random pointer, which could point to any node in the list, or null.

Construct a deep copy of the list. The deep copy should consist of exactly n brand new nodes, where each new node has its value set to the value of its corresponding original node. Both the next and random pointer of the new nodes should point to new nodes in the copied list such that the pointers in the original list and copied list represent the same list state. None of the pointers in the new list should point to nodes in the original list.

For example, if there are two nodes X and Y in the original list, where X.random --> Y, then for the corresponding two nodes xand y in the copied list, x.random --> y.

Return the head of the copied linked list.

The linked list is represented in the input/output as a list of n nodes. Each node is represented as a pair of [val, random_index]where:

  • val: an integer representing Node.val
  • random_index: the index of the node (range from 0 to n-1) that the random pointer points to, or null if it does not point to any node.

Your code will only be given the head of the original linked list.

Example 1:

https://ithelp.ithome.com.tw/upload/images/20231007/20140728jKz94uVMKq.png

Input: head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
Output: [[7,null],[13,0],[11,4],[10,2],[1,0]]

Example 2:

https://ithelp.ithome.com.tw/upload/images/20231007/20140728BOEqb9A0Ms.png

Input: head = [[1,1],[2,1]]
Output: [[1,1],[2,1]]

Example 3:

https://ithelp.ithome.com.tw/upload/images/20231007/20140728IH8ZBFadh7.png

Input: head = [[3,null],[3,0],[3,null]]
Output: [[3,null],[3,0],[3,null]]

Constraints:

  • 0 <= n <= 1000
  • 104 <= Node.val <= 104
  • Node.random is null or is pointing to some node in the linked list.

解法(Java)

題目要複製一份鏈結陣列,乍聽之下好像沒甚麼,但其中的關鍵是有個random參數也要一併複製,第一個想法就是用Map 去記錄看過舊節點和新節點的對應,跑第二次迴圈的時候再塞入random的節點。

Runtime: 0 ms
Memory Usage: 42.8 MB (88.99%)

/*
// Definition for a Node.
class Node {
    int val;
    Node next;
    Node random;

    public Node(int val) {
        this.val = val;
        this.next = null;
        this.random = null;
    }
}
*/

class Solution {
    public Node copyRandomList(Node head) {
        if (head == null) return null;
        
        Map<Node, Node> map = new HashMap<>();
        
        Node curr = head;
        Node result = new Node(head.val);
        Node resultCurr = result;
        
        map.put(curr, resultCurr);
        
        while (curr.next != null) {
            resultCurr.next = new Node(curr.next.val);
            resultCurr = resultCurr.next;
            curr = curr.next;
            map.put(curr, resultCurr);
        }
        
        curr = head;
        resultCurr = result;
        while (curr != null) {
            resultCurr.random = map.get(curr.random);
            resultCurr = resultCurr.next;
            curr = curr.next;
        }
     
        return result;
    }
}

小結

這題目解完之後還多想了幾天,總覺得能夠再減少一點消耗,但還沒想出來就已經到要發文的日期了,反正整體表現也不差,之後有時間再重新想過一次吧~~

/images/emoticon/emoticon46.gif


上一篇
Day21 - Linked List - Conclusion Problem 3
下一篇
Day23 - Array and String Introduction
系列文
非資工本科的Leetcode刷題筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言