返回
深度解析 LeetCode 题 138:如何复制带有随机指针的链表?
前端
2024-01-06 14:27:27
技术方案
复制带有随机指针的链表,可以采用以下步骤:
- 准备工作: 创建两个哈希表,用于存储原始链表节点和复制链表节点的对应关系。
- 遍历原始链表:
- 对于每个原始链表节点,创建其复制节点。
- 将原始链表节点和复制链表节点存储在哈希表中。
- 更新复制链表的随机指针:
- 遍历复制链表。
- 对于每个复制链表节点,根据其对应原始链表节点的随机指针,查找其随机指针指向的复制链表节点。
- 返回复制链表的头节点:
- 复制链表的头节点就是原始链表的头节点的复制节点。
代码示例
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)。该算法易于理解和实现,适用于各种编程语言。