[JAVA/LeetCode] Top 100 Liked Question: 138. Copy List with Random Pointer

👀 문제

https://leetcode.com/problems/copy-list-with-random-pointer/

👊 도전

1. 설계

  1. 주어진 리스트 head를 깊은 복사하여 리턴한다.

2. 구현

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
/**
 *
 * @author HEESOO
 *
 */
/*
// 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 head;
        
        HashMap<Node, Node> map=new HashMap<>();
        Node p=head;
        while(p!=null){ // 새 노드 생성
            map.put(p, new Node(p.val));
            p=p.next;
        }
        
        p=head;
        while(p!=null){ // 새 노드들에 next, random 연결
            map.get(p).next=map.get(p.next);
            map.get(p).random=map.get(p.random);
            p=p.next;
        }
        
        return map.get(head);
    }
}

3. 결과

실행결과 🤟 성공 🤟

4. 설명

  1. 해시맵을 이용한다
    • Key는 기존 리스트의 노드, Value는 기존 노드를 복사한 새 노드가 된다.
    • 처음 while문을 통해 기존 노드와 val이 같은 새 노드를 만들어서 맵에 넣는다.
    • 두 번째 while문에서 새 노드(p를 key로 가지는 값의 value)의 next와 random을 연결한다.

👏 해결 완료!

처음에는 맵의 형태를 <Integer, Node>로 하여 코드를 짰는데, 노드의 val은 중복 값이 존재하기 떄문에 해당 방법은 불가능하는 것을 알고 다른 풀이를 참고하였다.