首页 > 其他分享 >LeetCode1024 -- 贪心

LeetCode1024 -- 贪心

时间:2023-03-07 09:55:44浏览次数:45  
标签:Node head -- random LeetCode1024 链表 refto 节点 贪心

1. 题目描述

这题题意感觉说的不是很清楚,容易让人产生歧义!其实题意很简单,给你一个链表 head,你深拷贝它,然后返回即可,注意不能修改原链表

/*
// Definition for a Node.
class Node {
public:
    int val;
    Node* next;
    Node* random;
    
    Node(int _val) {
        val = _val;
        next = NULL;
        random = NULL;
    }
};
*/


2. 坑

首先,这题绝对没你看上去的那么简单,复制链表?太简单了,不就是链表的创建吗?
不!本题有一个有意思的地方,就是它有一个随机指针,随机指针以为着什么?
意味着,它指向的节点,可能还未创建!
因此说,我们不能直接遍历链表,来创建新链表,需要一些特殊方法

3. 思路1 -- 哈希表

\(O(N)\)时间, \(O(N)\)空间

思路呢,也很简单,既然随机指针可能指向一个还未创建的节点,那么我们就先创建它,然后通过哈希表存起来,并与原链表的相应节点做映射。
这样,当我们下次遍历到这个随机节点时,我们可以检查一下哈希表,看看是否已经建立过了,避免重复创建节点。

代码

// 本题的难点主要在于,当我们需要将指针指向某个节点时
// 随机指针指向的节点可能还不存在
class Solution {
public:
    Node* copyRandomList(Node* head) {
        if(head == nullptr) return nullptr;
        Node *dummy = new Node(-1);
        Node *cur = dummy;
        // refto 存储的时,原链表head与它的拷贝之间的映射
        unordered_map<Node*, Node*> refto;
        while(head) { 
            // 遍历原链表的每一个节点,创建它自己和他的random指针指向的节点
            // 并让它的random指针指向原链表random指针指向的节点
            if(refto[head] == nullptr) {
                Node *newNode = new Node(head->val);
                refto[head] = newNode;
            }
            if(head->random && refto[head->random] == nullptr) {
                Node *newNode = new Node(head->random->val);
                refto[head->random] = newNode;
            }
            
            refto[head]->random = refto[head->random];
            cur->next = refto[head];
            cur = refto[head];

            head = head->next;
        }
        return dummy->next;
    }
};


4. 思路2 -- 原地修改

\(O(N)\) 时间, \(O(1)\)空间。
注意在计算空间复杂度时,是不考虑创建新链表产生的空间的,因为那是必须的,我们主要考虑的时额外空间的复杂度

标签:Node,head,--,random,LeetCode1024,链表,refto,节点,贪心
From: https://www.cnblogs.com/ALaterStart/p/17187024.html

相关文章

  • C字符数组和字符指针
    constchar*string="abcd";charstring[]="abcd";第一种称为字符串常量,字符串存储在常量区,由字符指针进行访问,但是不能够修改第二种是字符串数组,相当于创......
  • 90.子集 2
    子集2给你一个整数数组nums,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。解集不能包含重复的子集。返回的解集中,子集可以按任意顺序排列。示例1:输......
  • java mac安装java程序
    目录javamac安装java程序安装包下载安装javamac安装java程序mac和windows的安装包下载地址类似安装包下载https://www.oracle.com/technetwork/java/javase/download......
  • javascript之web worker
    众所周知,js最初设计是运行在浏览器中的,为了防止多个线程同时操作DOM,带来渲染冲突问题,所以js执行器被设计成单线程。但随着前端技术的发展,js能力远不止如此,当我们遇到需要大......
  • 更改windows桌面路径的教程
    第一步:键盘上按住"win+E"打开文件资源管理器,然后快速访问的桌面,点击“属性”。第二步:默认桌面在用户名下的Desktop文件夹,比如:C:\Users\ataola\Desktop,在注册表的路径为......
  • 性能测试—笔记
     性能测试:模拟用户负载测试系统在负载情况下,系统的响应时间,吞吐量等指标是否满足性能要求性能测试在系统测试同一阶段基于单元测试,集成测试,功能测试都完成的基础上,站在用......
  • idea2021通用配置
    1、设置入口目前使用的是新版本2021.2,所以全局配置的入口会跟之前旧版本的有些不同。打开idea,可以看到customize,然后点击allsettings,里面就是所有的全局配置选项,配......
  • MySQL 安装过程中踩过的坑
    1、用 grep'temporarypassword'/var/log/mysqld.log生成的初始密码老提示密码错误,只能直接发大招:       A、vi/etc/my.cnf在文件的[mysqld]内增加一行 ......
  • C++中使用interface
    C++中使用interface使用struct;不使用成员变量,只使用成员函数;所有成员函数都是纯虚的;不使用构造函数和析构函数;参考C++的interface_c++interface_Stephan_zry的博......
  • 单例模式应用于login-加装饰器
     importrandomdefsingleton(class_):instances={}defget_instance(*args,**kwargs):ifclass_notininstances:instances[cl......