news 2026/4/5 10:58:22

hot100 138.随机链表的复制

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
hot100 138.随机链表的复制

1.题目要求:深拷贝一个链表,要求新链表中的每个节点都是新创建的,并且这些节点的random指针都指向新链表中的相应节点。

2.思路:

(1)如果没有random指针,只需要在遍历链表的同时,依此复制每个节点(创建新节点并复制val),添加在新链表的末尾。

(2)有random指针,拷贝就变得复杂了。需要知道random指向的那个节点,在新链表中是哪个节点。

(3)所以必须记录原链表节点到新链表节点的映射(map)。这样可以通过原链表random指向的节点,知道新链表的random应该指向哪个节点。

(4)难道应该使用哈希表吗?其实不需要。可以把新链表和旧链表“混在一起”。

(5)举例:有一个链表1->2->3,依次复制每个节点(创建新节点并复制val和next),把新节点直接插到原节点的后面,形成一个交错链表:1->1'->2->2'->3->3'。

(6)此时,原链表节点的下一个节点,就是其对应的新链表节点了。

(7)然后遍历这个交错链表,假如节点1的random指向节点3,那么就把节点1'的random指向节点3的下一个节点3',这样就完成了对random指针的复制。

(8)最后,从交错链表中分离出1'->2'->3',即为深拷贝后的链表。(注意:不能只删除节点1,2,3,因为题目要求原链表的next不能修改)。

3.复杂度分析:

(1)时间复杂度:O(n),其中n是链表的长度。

(2)空间复杂度:O(1),返回值不计入。

附代码:

class Solution { public Node copyRandomList(Node head) { if(head == null){ return head; } //复制每个节点,把新节点直接插到原节点的后面 for(Node cur = head;cur != null;cur = cur.next.next){ cur.next = new Node(cur.val,cur.next); //创建一个新节点:复制原节点的值,将新节点的next指向原节点的下一个节点 } //遍历交错链表中的原链表节点 for(Node cur = head;cur != null;cur = cur.next.next){ if(cur.random != null){ //要复制的random是cur.random的下一个节点 //cur表示每一个原节点 //cur.next表示每一个复制节点 //cur.next.random表示每一个复制节点的random指针 //cur.random表示每一个原节点的random指针 //cur.random.next表示每一个原节点的random指针的下一个节点,即原节点的的random指针指向节点的对应复制节点 cur.next.random = cur.random.next; } } //把交错链表分离成两个链表 Node newHead = head.next; //新链表的头是原链表头的复制节点 Node cur = head; //表示当前处理的原节点 //cur在循环外声明,是为了保证后面循环结束后仍可以访问cur for(;cur.next.next != null;cur = cur.next){ //当cur后面至少有两个节点时继续循环,因为要保证当前原节点有复制节点和下一个原节点 Node copy = cur.next; //用copy表示当前复制节点 cur.next = copy.next; //原节点指向下一个原节点 copy.next = copy.next.next; //复制节点指向下一个复制节点 } // cur.next.next == null时,循环结束,此时cur指向最后一个原节点 cur.next = null; //恢复最后一个原节点的指针指向,最后一个原节点应该指向null return newHead; } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/2 0:30:56

PyTorch-CUDA-v2.6镜像运行RetNet新型架构初步尝试

PyTorch-CUDA-v2.6 镜像运行 RetNet 新型架构实践 在当前深度学习模型日益复杂、训练任务对算力需求不断攀升的背景下,如何快速构建一个稳定、高效的 GPU 开发环境,已成为研究人员和工程师面临的第一道门槛。尤其是在尝试如 RetNet 这类新兴序列建模架构…

作者头像 李华
网站建设 2026/3/28 0:48:52

工业HMI场景下I2C HID设备故障代码10图解说明

工业HMI中I2C HID设备“无法启动(代码10)”故障深度排查实录在工业现场,一个看似简单的触摸屏失灵问题,可能让整个产线停摆。某天清晨,工程师接到报警:一台HMI终端开机后触控完全无响应——设备管理器里赫然…

作者头像 李华
网站建设 2026/4/2 6:06:50

PyTorch-CUDA-v2.6镜像支持LoRA微调大模型吗?技术预研

PyTorch-CUDA-v2.6镜像支持LoRA微调大模型吗?技术预研 在当前大模型研发如火如荼的背景下,一个现实而紧迫的问题摆在许多团队面前:如何在有限的GPU资源下,快速、稳定地完成对LLaMA、ChatGLM等大型语言模型的定制化微调&#xff1f…

作者头像 李华
网站建设 2026/4/3 23:32:27

PyTorch-CUDA-v2.6镜像中使用FlashAttention加速Transformer

PyTorch-CUDA-v2.6镜像中使用FlashAttention加速Transformer 在大模型时代,训练一个能处理万级序列长度的Transformer不再是“能不能”的问题,而是“快不快、省不省”的工程挑战。你有没有经历过这样的场景:刚跑起一个文本分类任务&#xff0…

作者头像 李华
网站建设 2026/4/3 22:28:22

手把手教你排查Multisim14.0主数据库缺失的软件冲突问题

手把手排查Multisim 14.0主数据库打不开?别急,90%的问题都出在这几个地方! 你有没有遇到过这样的情况:刚装好Multisim 14.0,一打开就弹窗提示“Database initialization failed”或者“Main database not found”&…

作者头像 李华
网站建设 2026/3/19 7:21:15

PyTorch-CUDA-v2.6镜像运行Diffusion Model图像去噪过程解析

PyTorch-CUDA-v2.6镜像运行Diffusion Model图像去噪过程解析 在当前生成式AI迅猛发展的背景下,图像修复与去噪任务正从传统的卷积网络转向更具表现力的扩散模型(Diffusion Model)。这类模型虽然效果惊艳,但对计算资源的要求极高—…

作者头像 李华