Skip to content

138. Copy List with Random Pointer

#197

Problem link

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

Problem Summary

랜덤 포인터가 있는 링크드 리스트를 그대로 복사하는 문제

Solution

죽 돌면서 복사하면 된다. 랜덤 포인터의 경우 map으로 random 노드를 관리해주면 된다.

Source Code

# Definition for a Node.
from typing import Optional


class Node:
    def __init__(self, x: int, next: 'Node' = None, random: 'Node' = None):
        self.val = int(x)
        self.next = next
        self.random = random


class Solution:
    def copyRandomList(self, head: 'Optional[Node]') -> 'Optional[Node]':
        if not head:
            return None

        new_head = Node(head.val)

        node_map = {head: new_head}

        node = head.next
        prev = new_head

        while node:
            new_node = Node(node.val)
            prev.next = new_node
            node_map[node] = new_node
            prev = new_node
            node = node.next

        node = head
        prev = new_head
        while node:
            if node.random:
                prev.random = node_map[node.random]
            prev = prev.next
            node = node.next

        return new_head