📅  最后修改于: 2023-12-03 15:36:45.351000             🧑  作者: Mango
这道题目要求我们在不改变原链表的基础上,克隆出一个与原链表结构相同的链表,其中包括next指针和random指针。这道题目可以用两种方案来解决。
在这种方案中,我们可以用一个哈希表来存储新链表中每个节点对应的random指针在新链表中对应的节点,然后再遍历一次原链表,将新链表中的每个节点的random指针根据哈希表进行连接。
class Solution:
def copyRandomList(self, head: 'Node') -> 'Node':
if not head:
return None
visited = {}
curr = head
while curr:
visited[curr] = Node(curr.val, None, None)
curr = curr.next
curr = head
while curr:
visited[curr].next = visited.get(curr.next)
visited[curr].random = visited.get(curr.random)
curr = curr.next
return visited[head]
哈希表的存储和查找操作都需要O(1)的时间,因此时间复杂度为O(N),其中N为链表的长度。空间复杂度为O(N),因为需要额外空间存储哈希表。
在这种方案中,我们可以将新节点插入到原链表中,例如将新节点插入到原链表中的每个节点的next指针处,然后再遍历一次原链表,将每个新节点的random指针连接到它原节点的random指针的下一个节点上。
class Solution:
def copyRandomList(self, head: 'Node') -> 'Node':
if not head:
return None
curr = head
while curr:
node = Node(curr.val, None, None)
node.next = curr.next
curr.next = node
curr = node.next
curr = head
while curr:
if curr.random:
curr.next.random = curr.random.next
curr = curr.next.next
curr = head
new_head = head.next
while curr:
tmp = curr.next
curr.next = tmp.next
if tmp.next:
tmp.next = tmp.next.next
curr = curr.next
return new_head
该方法需要对原链表进行三次遍历,因此时间复杂度为O(N),其中N为链表的长度。空间复杂度为O(1),不需要额外的空间。