返回

深度解析 LeetCode 题 138:如何复制带有随机指针的链表?

前端

技术方案

复制带有随机指针的链表,可以采用以下步骤:

  1. 准备工作: 创建两个哈希表,用于存储原始链表节点和复制链表节点的对应关系。
  2. 遍历原始链表:
    • 对于每个原始链表节点,创建其复制节点。
    • 将原始链表节点和复制链表节点存储在哈希表中。
  3. 更新复制链表的随机指针:
    • 遍历复制链表。
    • 对于每个复制链表节点,根据其对应原始链表节点的随机指针,查找其随机指针指向的复制链表节点。
  4. 返回复制链表的头节点:
    • 复制链表的头节点就是原始链表的头节点的复制节点。

代码示例

def copyRandomList(head):
    # 创建两个哈希表
    node_to_copy = {}
    copy_to_node = {}

    # 遍历原始链表,创建复制链表
    current = head
    while current:
        # 创建复制节点
        copy = Node(current.val)

        # 将原始链表节点和复制链表节点存储在哈希表中
        node_to_copy[current] = copy
        copy_to_node[copy] = current

        # 移动到下一个节点
        current = current.next

    # 更新复制链表的随机指针
    current = head
    while current:
        # 获取原始链表节点的随机指针指向的节点
        random_node = current.random

        # 如果随机指针指向的节点存在,则更新复制链表节点的随机指针
        if random_node:
            copy = node_to_copy[current]
            random_copy = node_to_copy[random_node]
            copy.random = random_copy

        # 移动到下一个节点
        current = current.next

    # 返回复制链表的头节点
    return node_to_copy[head]

复杂度分析

  • 时间复杂度:O(n),其中 n 是原始链表的长度。
  • 空间复杂度:O(n),其中 n 是原始链表的长度。

算法原理

该算法首先创建一个哈希表,将原始链表节点和复制链表节点存储起来。然后,遍历原始链表,创建复制链表。在创建复制链表时,将原始链表节点和复制链表节点存储在哈希表中。最后,遍历复制链表,根据原始链表节点的随机指针,更新复制链表节点的随机指针。

总结

该算法提供了一种简单、有效的解决方案,可以复制带有随机指针的链表。算法的时间复杂度为 O(n),空间复杂度为 O(n)。该算法易于理解和实现,适用于各种编程语言。