LeetCode:138. 随机链表的复制之如何有效copy

news2024/12/26 22:02:25

 自己复制的话,很容易写出来一个时间复杂度O(n ^ 2) 空O(n)的做法

我们可以参考基因的复制,

目录

题目:

实现思路(基因复制式的copy):

官方快慢指针解法:时O(n)空O(1)

 博主的 时O(n ^ 2) 空O(n)刺眼代码:

每日表情包:


题目:

快慢指针实现思路(基因复制式的copy):

                1,创建结点:我们插入式的给每个结点的后面创建我们的新链表的结点(后续会把创建的结点抠出来)

                2,赋值:我们根据(模仿)创建的新结点的复制对象,易知我们copy的新结点的。random指针指向的就是复制对象的random指针所指向的结点的下一个结点。

                3,把copy的结点抠出来,

(细节,注意random可能指向NULL),如果看不懂可以去看视频力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

官方快慢指针解法:时O(n)空O(1)

struct Node* copyRandomList(struct Node* head) {
    if (head == NULL) {
        return NULL;
    }
    for (struct Node* node = head; node != NULL; node = node->next->next) {
        struct Node* nodeNew = malloc(sizeof(struct Node));
        nodeNew->val = node->val;
        nodeNew->next = node->next;
        node->next = nodeNew;
    }
    for (struct Node* node = head; node != NULL; node = node->next->next) {
        struct Node* nodeNew = node->next;
        nodeNew->random = (node->random != NULL) ? node->random->next : NULL;
    }
    struct Node* headNew = head->next;
    for (struct Node* node = head; node != NULL; node = node->next) {
        struct Node* nodeNew = node->next;
        node->next = node->next->next;
        nodeNew->next = (nodeNew->next != NULL) ? nodeNew->next->next : NULL;
    }
    return headNew;
}

作者:力扣官方题解
链接:https://leetcode.cn/problems/copy-list-with-random-pointer/solutions/889166/fu-zhi-dai-sui-ji-zhi-zhen-de-lian-biao-rblsf/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 博主的 时O(n ^ 2) 空O(n)刺眼代码:

/**
 * Definition for a Node.
 * struct Node {
 *     int val;
 *     struct Node *next;
 *     struct Node *random;
 * };
 */
struct Node* BuyNode()
{
    struct Node* ptmp = (struct Node*)malloc(sizeof(struct Node));
    //assert(ptmp);
    ptmp->next = NULL;
    return ptmp;
}
struct Node* copyRandomList(struct Node* head) {
    //sentry head 没动
	struct Node* Sentry = BuyNode();//sentry哨兵
    //assert(Sentry);
    struct Node* pcur = head, * pfr = head;//pfr == pFindRandom
    struct Node* pNewTmp = Sentry;
    //新链表
    while(pcur){
        pNewTmp->next = BuyNode();
        pNewTmp = pNewTmp->next;
        pNewTmp->val = pcur->val;
        pcur = pcur->next;
    }
    //处理random
    struct Node* pNewCur = Sentry->next;
    pcur = head;
    while(pNewCur){
        //找对应节点
        pfr = head;
        pNewTmp = Sentry->next;
        while(pcur->random != pfr){
            pfr = pfr->next;
            pNewTmp = pNewTmp->next;
        }
        //赋值random
        pNewCur->random = pNewTmp;
        //next结点
        pNewCur = pNewCur->next;
        pcur = pcur->next;
    }
    //free(sentry);
    return Sentry->next;
}

每日表情包:

我王小桃想要赞!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1428732.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

delete、truncate和drop区别

一、从执行速度上来说 drop > truncate >> DELETE 二、从原理上讲 1、DELETE DELETE from TABLE_NAME where xxx1.1、DELETE属于数据库DML操作语言,只删除数据不删除表的结构,会走事务,执行时会触发trigger( 触发器…

干旱绿洲农田无核白葡萄树蒸散发的分割研究_王尚涛_2021

干旱绿洲农田无核白葡萄树蒸散发的分割研究_王尚涛_2021 摘要关键词 1 材料方法1.1 研究区概况1.2 试验设计1.2.1 树干液流1.2.2 蒸散发1.2.3 气象因子1.2.4 土壤蒸发 2 结果与分析2.1 气象因子变化特征2.2 蒸散发及其组分变化特征2.3 蒸腾与总蒸散的比值(T/ET&…

Vue3学习记录(一)--- 组合式API之基础概念和变量声明

一、组合式API基础 1、简介 ​ 组合式 API (Composition API) 是Vue3和Vue2的v2.7之后版本中的全新特性,是一系列API的的集合(响应式API、生命周期钩子、依赖注入等等),其风格是基于函数的组合,以一种更直观、更灵活…

编程实例分享,眼镜店电脑系统软件,配件验光管理顾客信息记录查询系统软件教程

编程实例分享,眼镜店电脑系统软件,配件验光管理顾客信息记录查询系统软件教程 一、前言 以下教程以 佳易王眼镜店顾客档案管理系统软件V16.0为例说明 如上图, 点击顾客档案,在这里可以对顾客档案信息记录保存查询,…

idea项目如何上传gitee

1.先创建仓库(nonono!!!idea上传会自动创建仓库!!!!) 2.从gitee上面clone下来(nonono!!!!这个.git文件也是自动…

【2024年美赛】C题,一二问的模型AUC为1.0,泛化能力超强

2024年美赛C题第一二问模型 基于L2正则化的Logistic回归模型AUC 1.0 !!! 并且超强泛化能力 基于L2正则化的Logistic回归模型 考虑到这里可以看作是一个二分类问题,且需要对模型和结果进行解释和可视化,因此,我选择了基于L2正则化的Logistic…

小程序支付类型接入京东支付

一、情景描述 当前项目想在微信小程序付款时添加上京东支付支付类型,效果如下 普通的付款方式可以直接付款就能完成支付,但京东支付无法在小程序上直接付款,他需要复制生成的链接,然后打开京东app然后在京东平台上付款。 所以&…

【已更新】2024美赛C题代码教学思路数据处理数学建模分析Momentum in Tennis

问题一完整的代码已给出,预计2号晚上或者3号凌晨全部给出。 代码逻辑如下: C题第一问要求我们开发一个模型,捕捉得分时的比赛流程,并将其应用于一场或多场比赛。你的模型应该确定哪名球员在比赛的特定时间表现得更好,…

洛谷p1644跳马问题

跳马问题 题目背景 在爱与愁的故事第一弹第三章出来前先练练四道基本的回溯/搜索题吧…… 题目描述 中国象棋半张棋盘如图 1 1 1 所示。马自左下角 ( 0 , 0 ) (0,0) (0,0) 向右上角 ( m , n ) (m,n) (m,n) 跳。规定只能往右跳,不准往左跳。比如图 1 1 1 中所…

python解决替换空格问题

对于字符串中,利用指定字符替换字符串中的所有空格,使用合适的方法来避免多次移动字符的操作,考虑使用python的内置方法来简便的解决该问题,可以更加了解到python的便捷。 对于给定一个内部含有空格字符的字符串input_str&#x…

git小白进阶之路

git是最常用的版本控制工具,我对其进行了整理后续补充,这个文档欢迎大家来讨论,当前我的视频梳理: git小白进阶之路_哔哩哔哩_bilibili,非常希望大佬们能够批评指正,并多多交流。 目录 初始配置 配置账号…

JUC并发编程02——线程原理(运行机制,线程调度,未来优化)

1.线程原理 1.运行机制 Java Virtual Machine Stacks(Java 虚拟机栈):每个线程启动后,虚拟机就会为其分配一块栈内存 每个栈由多个栈帧(Frame)组成,对应着每次方法调用时所占用的内存每个线程…

Unity_使用Shader实现玻璃和镜面效果

效果图如下: 玻璃效果图 镜面效果图 Step1 搭建场景→镜子使用Quad代替,放置在需要反射的墙面→创建新的材质和Shader Step2 墙壁外创建Camera,用来渲染物体后方的视图→创建RenderTexture,赋于该相机 Step3 Shader的编写如下…

腾讯云云监控实践:使用云审计 CloudAudit SDK 精准管理腾讯云资源

文章目录 前言一、什么是腾讯云的操作审计 CloudAudit二、CloudAudit 有哪些优势三、CloudAudit 应用场景举例3.1 安全分析3.2 资源变更跟踪3.3 合规性审计 四、使用云审计 SDK 进行云监控4.1 安装环境包 PHP4.2 下载并解压云审计 PHP SDK4.3 创建的腾讯云持久证书(…

机器学习入门-----sklearn

机器学习基础了解 概念 机器学习是人工智能的一个实现途径 深度学习是机器学习的一个方法发展而来 定义:从数据中自动分析获得模型,并利用模型对特征数据【数据集:特征值+目标值构成】进行预测 算法 数据集的目标值是类别的话叫做分类问题;目标值是连续的数值的话叫做回…

第二十一回 阎婆大闹郓城县 朱仝义释宋公明-FreeBSD Linux 使用Rsync备份

阎婆状告宋江杀死她女儿阎婆惜,知县有意偏袒宋江,只是一味的拷打唐牛儿,但无奈张三张文远说刀子是宋江的,知县不得已差人拿宋江来审问。第一次没见到人,第二次派朱仝雷横两个人去。 朱仝到地窖里找到了躲藏的宋江&…

【Java程序设计】【C00243】基于Springboot的社区医院管理系统(有论文)

基于Springboot的社区医院管理系统(有论文) 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的社区医院管理服务系统 本系统分为系统功能模块、管理员功能模块、用户功能模块以及医生功能模块。 系统功能模块:社…

C++数据结构与算法——哈希表

C第二阶段——数据结构和算法,之前学过一点点数据结构,当时是基于Python来学习的,现在基于C查漏补缺,尤其是树的部分。这一部分计划一个月,主要利用代码随想录来学习,刷题使用力扣网站,不定时更…

学习Android的第一天

目录 什么是 Android? Android 官网 Android 应用程序 Android 开发环境搭建 Android 平台架构 Android 应用程序组件 附件组件 Android 第一个程序 HelloWorld 什么是 Android? Android(发音为[ˈnˌdrɔɪd],非官方中文…

C#读取和保存INI文件配置

在C#应用程序中,读取和保存配置文件是常见的任务,而INI文件是一种轻量级的配置文件格式。在以下代码中,我们将探讨如何使用C#创建一个窗体应用程序,并通过读取和保存INI文件配置来实现一些基本的功能。 创建IniHelper类 首先&…