剑指 Offer 35. 复杂链表的复制 - 力扣(LeetCode) (leetcode-cn.com)
题目
请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。
示例 1:

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

输入:head = [[1,1],[2,1]]输出:[[1,1],[2,1]]
示例 3:

输入:head = [[3,null],[3,0],[3,null]]输出:[[3,null],[3,0],[3,null]]
示例 4:
输入:head = []输出:[]解释:给定的链表为空(空指针),因此返回 null。
提示:
-10000 <= Node.val <= 10000Node.random为空(null)或指向链表中的节点。- 节点数目不超过 1000 。
注意:本题与主站 138 题相同:https://leetcode-cn.com/problems/copy-list-with-random-pointer/
初始代码
```python “””Definition for a Node.
class Node: def init(self, x: int, next: ‘Node’ = None, random: ‘Node’ = None):
“”” class Solution: def copyRandomList(self, head: ‘Node’) -> ‘Node’:self.val = int(x)self.next = nextself.random = random
<a name="Dh22x"></a>### 提交代码```python"""# Definition for a Node.class Node:def __init__(self, x: int, next: 'Node' = None, random: 'Node' = None):self.val = int(x)self.next = nextself.random = random"""class Solution:def copyRandomList(self, head: 'Node') -> 'Node':if not head: returncur = head# 1. 复制各节点,并构建拼接链表while cur:tmp = Node(cur.val)tmp.next = cur.nextcur.next = tmpcur = tmp.next# 2. 构建各新节点的 random 指向cur = headwhile cur:if cur.random:cur.next.random = cur.random.nextcur = cur.next.next# 3. 拆分两链表cur = res = head.nextpre = headwhile cur.next:pre.next = pre.next.nextcur.next = cur.next.nextpre = pre.nextcur = cur.nextpre.next = None # 单独处理原链表尾节点return res # 返回新链表头节点
分析
剑指 Offer 35. 复杂链表的复制(哈希表 / 拼接与拆分,清晰图解) - 复杂链表的复制 - 力扣(LeetCode)
