跳到主要内容

138. 复制带随机指针的链表

138. 复制带随机指针的链表

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

给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。

要求返回这个链表的 深拷贝。

我们用一个由 n 个节点组成的链表来表示输入/输出中的链表。每个节点用一个 [val, random_index] 表示:

val:一个表示 Node.val 的整数。 random_index:随机指针指向的节点索引(范围从 0 到 n-1);如果不指向任何节点,则为 null 。

示例 1:

image

输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]

示例 2:

image

输入:head = [[1,1],[2,1]]
输出:[[1,1],[2,1]]

示例 3:

image

输入:head = [[3,null],[3,0],[3,null]]
输出:[[3,null],[3,0],[3,null]]

示例 4:

输入:head = []
输出:[]
解释:给定的链表为空(空指针),因此返回 null。

提示:

  • -10000 <= Node.val <= 10000
  • Node.random 为空(null)或指向链表中的节点。
  • 节点数目不超过 1000 。

通过次数36,172 | 提交次数67,426

First Try

2020-07-07

重点是,dict竟然能够用node作为字典key。其实如果不行的话,直接使用id(node)内存地址来也行。

之前做过图的深度复制,这道应该说更简单了,结果还是花了过多时间。没想到random的指向并没有idx之类的标记,指向的就是node内存本身了。所以只能上字典映射了。


"""
# Definition for a Node.
class Node:
def __init__(self, x, next=None, random=None):
self.val = int(x)
self.next = next
self.random = random
"""

class Solution(object):
def copyRandomList(self, head):
"""
:type head: Node
:rtype: Node
"""

# 重点是,dict竟然能够用node作为字典key。其实如果不行的话,直接使用id(node)内存地址来也行。
if not head:
return head
dummy = node = Node(-1)
node.next = head
moc = dict({dummy: Node(-1)}) # map of cache

while node.next:
if not moc.get(node.next):
moc[node.next] = Node(node.next.val)
moc[node].next = moc[node.next]
if node.next.random:
if not moc.get(node.next.random, None):
moc[node.next.random] = Node(node.next.random.val)
moc[node.next].random = moc[node.next.random]

node = node.next
# print(node)

return moc[head]
  • 执行用时:48 ms, 在所有 Python 提交中击败了87.84%的用户
  • 内存消耗:13.4 MB, 在所有 Python 提交中击败了100.00%的用户