📌  相关文章
📜  克隆带有下一个和随机指针的链表 | 2套(1)

📅  最后修改于: 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),不需要额外的空间。