LeeCode Hot100随机链表的复制 java易懂题解

原链接:随机链表的复制

这道题并不难,容易想到使用哈希表(毕竟每一个节点都是独一无二的)

但是,怎么使用是一个问题

这里,我使用哈希表存储结点,key是它对应的原来的连表当中的结点,value就是它本身

为什么key是对应的原结点而不是对应的val?

通过Case3我们可以知道:

三个结点是可能相等的

这样我们哈希表进行存储就是有问题的

需要其他的用于区分不同的结点

原节点对应的random可以吗?

不行

多个节点的random可能是一样的

但是每个结点对应的原结点是独一无二的

通过(node,newNode)的键值对进行存储我们能够在后续代码当中快速找到对应的结点

整个思路:

  1. 一个while循环建立基础的链表,同时通过上述的哈希表进行存储

  2. 第二个while循环,遍历每个结点,通过哈希表查找对应的random结点

整体代码

java 复制代码
class Solution {
    public Node copyRandomList(Node head) {
        Node preHead = new Node(0);
        Node q=preHead;
        Node p=head;
        HashMap<Node, Node> pos = new HashMap<>();
        //存在random是null的情况,需要存储
        pos.put(null,null);
        while(p!=null){
            Node newNode = new Node(p.val);
            pos.put(p,newNode);
            q.next=newNode;
            q=q.next;
            p=p.next;
        }
        q=preHead.next;
        p=head;
        while(p!=null){
            q.random=pos.get(p.random);
            q=q.next;
            p=p.next;
        }
        return preHead.next;
    }
}

代码分析

时间复杂度:O(N)

空间复杂度:O(N)

和官方的两种方法时间复杂度相同,空间复杂度虽然不一定比得过,没有用到迭代或者回溯,更加简单易懂

相关推荐
十二同学啊2 分钟前
Python 工程化详解:项目结构、依赖管理、代码质量、测试与部署
java·开发语言·python
YIN_尹7 分钟前
【git原理与使用】git基本操作及底层原理(一)
java·git·elasticsearch
starzy19909 分钟前
Scala List操作:不可变链表的函数式美学
链表·list·scala
程序员飞哥16 分钟前
AI 编程额度怎么用才不浪费?
java·前端·后端
yh弓长21 分钟前
Spring MVC 的请求链路
java·spring·mvc
拆房老料22 分钟前
【第四部分:Agentic 智能体设计模式】17. Agent 路由模式详解:从意图识别到动态模型选择
java·设计模式·ai编程·策略模式
樱花落木兰35 分钟前
Redis 消息队列的可靠性演进:从 List、Pub/Sub 到 Stream 消费者组,以及 8.x 版本改变了什么
java·开发语言·经验分享·redis·分布式·python·软件工程
wtblszn1 小时前
凹版印刷机智慧运维物联网系统方案
java·运维·物联网
Nuanyt1 小时前
LeetCode Hot 100 链表专题(四)· 3 题(Java)
java·算法·leetcode·链表·双指针
zhongben_keji1 小时前
本地生活 APP 开发:城市 × 品类 × 履约形态的三维网格与三套账
java·大数据·生活