LeetCode 138. 随机链表的复制

题目描述

138. 随机链表的复制

思路分析

解决这个问题可以分为三个步骤:

  1. 在原链表的每个节点后面插入一个新节点,新节点的值与原节点相同。
  2. 更新新节点的随机指针,使其指向原节点随机指针指向的节点的下一个节点。
  3. 将链表拆分成原链表和复制后的链表。

参考代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
func copyRandomList(head *Node) *Node {
	if head == nil {
		return nil
	}

	// 第一步:在每个节点后面插入一个新节点
	cur := head
	for cur != nil {
		newNode := &Node{Val: cur.Val, Next: cur.Next}
		cur.Next = newNode
		cur = newNode.Next
	}

	// 第二步:更新新节点的随机指针
	cur = head
	for cur != nil {
		if cur.Random != nil {
			cur.Next.Random = cur.Random.Next
		}
		cur = cur.Next.Next
	}

	// 第三步:拆分链表
	cur = head
	newHead := head.Next
	for cur != nil {
		newNode := cur.Next
		cur.Next = newNode.Next
		if newNode.Next != nil {
			newNode.Next = newNode.Next.Next
		}
		cur = cur.Next
	}

	return newHead
}
  • 时间复杂度:O (n),其中 n 是链表的长度。每个节点访问三次。
  • 空间复杂度:O (1),不需要额外空间。
1
write your code here

➡️ 点击查看 Java 题解

1
write your code here
本文作者:
本文链接: https://hgnulb.github.io/blog/2025/58473049
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!