📜  门| GATE-CS-2014-(Set-2) |第 56 题(1)

📅  最后修改于: 2023-12-03 15:12:42.198000             🧑  作者: Mango

题目描述

给定一个链表,其中每个节点都包含一个随机指针,该指针可能指向链表中的任何节点或空节点。请对此链表进行深度复制。请注意,该克隆列表应该与原始列表具有相同的结构,并具有相同的节点值和随机指针的目标。

函数定义
def copyRandomList(head: 'Node') -> 'Node':
输入输出格式

输入格式:

  • head:链表的头节点,类型为Node

输出格式:

  • 返回链表的头节点,类型为Node

因此,你需要实现Node类,从而使得Node节点按输入输出格式可传递。

示例

输入

1 -> 2 -> 3 -> 4 -> None
|    |         |    |
v    v         v    v
3    1         4    2

输出

1’ -> 2’ -> 3’ -> 4’ -> None
|    |         |    |
v    v         v    v
3’   1’        4’   2’
思路

本题要求我们实现一个复制链表。需要注意的是,链表中存在随机指针,因此我们需要对每个节点进行深度拷贝,并重新复制一份随机指针指向。在深度拷贝时,由于我们不能直接获得链表长度,因此需要使用一个哈希表来做节点映射,将原来的节点和新的节点一一对应。

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

def copyRandomList(head: 'Node') -> 'Node':
    if not head:
        return None

    nodes_dict = dict()
    new_head = Node(head.val)
    nodes_dict[head] = new_head

    old_node = head
    new_node = new_head

    # Copy the linked list without the random pointer
    while old_node.next:
        new_node.next = Node(old_node.next.val)
        nodes_dict[old_node.next] = new_node.next
        old_node = old_node.next
        new_node = new_node.next

    # Copy the linked list with the random pointer
    old_node = head
    new_node = new_head
    while old_node:
        if old_node.random:
            new_node.random = nodes_dict[old_node.random]
        old_node = old_node.next
        new_node = new_node.next

    return new_head
复杂度分析
  • 时间复杂度:$O(n)$
  • 空间复杂度:$O(n)$

注:部分参考了leetcode官方题解。