剑指 Offer(第2版)面试题 35:复杂链表的复制

2023-12-17

剑指 Offer(第2版)面试题 35:复杂链表的复制

剑指 Offer(第2版)面试题 35:复杂链表的复制

题目来源: 48. 复杂链表的复刻

解法1:模拟

算法:

  1. 复制原始链表的节点 N 并创建新节点 N’,把 N’ 链接到 N 的后面。
  2. 设置复制节点的 random 指针。
  3. 拆分链表:把奇数位置的节点链接起来就是原始链表,把偶数位置的节点链接起来就是复制链表,最后返回复制链表的头节点。

PS:少有的书上代码比其他解法要好的,推荐书上解法,拆分成三步走,清晰明了。

代码:

/**
 * Definition for singly-linked list with a random pointer.
 * struct ListNode {
 *     int val;
 *     ListNode *next, *random;
 *     ListNode(int x) : val(x), next(NULL), random(NULL) {}
 * };
 */
class Solution
{
public:
    ListNode *copyRandomList(ListNode *head)
    {
        CloneListNodes(head);
        SetRandomPointer(head);
        return SplitList(head);
    }
    // 第一步:复制原始链表的节点 N 并创建新节点 N',把 N' 链接到 N 的后面
    void CloneListNodes(ListNode *head)
    {
        ListNode *p = head;
        while (p)
        {
            // 复制节点
            ListNode *clone = new ListNode(0);
            clone->val = p->val;
            clone->next = p->next;
            clone->random = nullptr;
            
            p->next = clone;
            p = clone->next;
        }
    }
    // 第二步:设置复制节点的 random 指针
    void SetRandomPointer(ListNode *head)
    {
        // 如果原始链表上的节点 N 的 random 指针指向 S,
        // 则它的复制节点 N' 的 random 指针指向 S'
        ListNode *p = head;
        while (p)
        {
            ListNode *clone = p->next;
            if (p->random)
                clone->random = p->random->next;
            p = clone->next;
        }
    }
    // 第三步:拆分链表
    ListNode *SplitList(ListNode *head)
    {
        ListNode *p = head;
        ListNode *cloneListHead = nullptr;
        ListNode *clone = nullptr;
        if (p)
        {
            cloneListHead = p->next;
            clone = p->next;
            p->next = clone->next;
            p = p->next;
        }
        while (p)
        {
            clone->next = p->next;
            clone = clone->next;
            p->next = clone->next;
            p = p->next;
        }
        return cloneListHead;
    }
};

复杂度分析:

时间复杂度:O(n),其中 n 是原始链表的节点个数。算法遍历了每个节点。

空间复杂度:O(n),其中 n 是原始链表的节点个数。算法创建了每个节点的副本。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

剑指 Offer(第2版)面试题 35:复杂链表的复制 的相关文章

随机推荐

  • 【C++】STL简介

    目录 一 版本 二 组件 1 容器 2 算法 三 重要性 四 缺陷 STL standard template libaray 标准模板库 C 编程语言的一个 标准库 它提供了一组通用的模板类和函数 以实现常见的数据结构和算法 STL的设计
  • 计算机毕设ssm高校新生报道管理系统的设计与实现0f06q9 独有(附源码)

    项目运行 环境配置 Jdk1 8 Tomcat7 0 Mysql HBuilderX Webstorm也行 Eclispe IntelliJ IDEA Eclispe MyEclispe Sts都支持 项目技术 vue mybatis Ma
  • 无线网络管理系统与无线路由器的区别

    第5章 波形发生器软件设计 本章我们将介绍系统的软件设计 系统中控制软件占有很重要的地位 它不仅要产生波形数据 控制波形的发生 还要控制显示电路和键盘电路 因此系统软件的好坏直接决定着系统的功能和稳定 5 1软件的总体结构 在本系统中 由于
  • yyy666

    6
  • Tekton 构建容器镜像

    Tekton 构建容器镜像 介绍如何使用 Tektonhub 官方 kaniko task 构建docker镜像 并推送到远程dockerhub镜像仓库 kaniko task yaml文件下载地址 https hub tekton dev
  • 目标检测YOLO实战应用案例100讲-自动驾驶复杂场景下目标检测(续)

    目录 3 2 YOLOv5框架的分析 3 3改进算法的基本思想 3 4改进聚类算法 3 5重构损失函数模型和NMS算法 lt
  • 008 Windows注册表

    一 注册表基础 1 概述 注册表 Registry 繁体中文版 Windows 操作系统称之为登录档案 是 Microsoft Windows 中的一个重要的数据库 用于 存储系统 和 应用程序 的设置信息 早在 Windows 3 0 推
  • 时序预测 | Python实现CNN电力需求预测

    时序预测 Python实现CNN电力需求预测 目录 时序预测 Python实现CNN电力需求预测 预测效果 基本描述 程序设计 参考资料
  • 海尔2024届秋招/校招内推信息/内推码

    公司名称 海尔 内推码 GHJ110 内推来源 内推鸭小程序 官方招聘网站 海尔招聘 海尔官方招聘网站
  • 每日一练2023.12.17——大笨钟的心情【PTA】

    题目链接 L1 077 大笨钟的心情 题目要求 有网友问 未来还会有更多大笨钟题吗 笨钟回复说 看心情 本题就请你替大笨钟写一个程序 根据心情自动输出回答 输入格式 输入在一行中给出 24 个 0 100 区间内的整数 依次代表大笨钟在一天
  • 挖矿木马应急响应-案例分析

    挖矿木马应急响应 案例分析 linux 终端无法使用系统资源使用异常高 首先解决linux命令无法使用的问题 显示libc so 6 没有重新连接一下libc文件 查看日志 发现木马运行成功后就日志一直报libc错误 根据信息向上插在日志
  • 2023年总结,讲讲我的故事吧,十年

    文章目录 2023 前十年 后十年 周末 本该是提升自己的最好时机 也该是出去玩的大好时光 但是毫无意外的 在家躺了一天 单纯的有点累 2023年 发生了好多事情 又好像没发生几件事 可能毕业季的我 走过了太多复杂的心路历程吧 身边的人 是
  • 服务器安全的威胁和防范

    由于服务器发挥着至关重要的作用 因此存储在服务器上的机密数据和信息非常具有价值 做好服务器安全至关重要 常见的服务器 安全隐患 包括 1 恶意的攻击 遭受CC攻击和DDoS攻击 导致游戏或是网站打不开 严重影响业务开展 2 网站挂马 网站被
  • 代码随想录算法训练营Day3 | 203.移除链表元素、707.设计链表、59.螺旋矩阵II

    LeetCode 203 移除链表元素 本题思路 就是常规的移除链表中的元素的操作 需要注意的点 头节点 head val val 的情况的处理 如果 head val val 就要继续往后 head head next 因此我们要遍历到第
  • 最强姿态模型 mmpose 使用实例

    mmpose 介绍 https blog csdn net jacke121 article details 135040186 图片姿态实例 本机地址 B project pose mmpose dev 1 x Copyright c O
  • Arrays.asList()方法:陷阱与解决之道

    在Java编程中 Arrays类提供了一系列用于操作数组的实用方法 其中 Arrays asList 方法是一个常用的方法 用于快速将数组转换为List集合 然而 这个方法存在一些潜在的陷阱 可能导致出现意外的行为 本文将介绍 Arrays
  • DSP捕获输入简单笔记

    程序 cap c Created on 2023年12月16日 Author My PC include cap h void cap init EALLOW SysCtrlRegs PCLKCR3 bit GPIOINENCLK 1 gp
  • 蓝禾2024届秋招/校招内推信息/内推码

    公司名称 蓝禾 内推码 SQDPVPM 内推来源 内推鸭小程序 官方招聘网站 https lanhevip jobs feishu cn index m position external referral code SQDPVPM
  • 007 Windows组策略

    组策略的应用 1 基本概念 组策略是一组策略的集合 组策略 英语 Group Policy 是 微软 Windows NT 家族操作系统的一个特性 它可以控制 用户帐户 和计算机帐户的工作环境 组策略提供了操作系统 应用程序 和 活动目录
  • 剑指 Offer(第2版)面试题 35:复杂链表的复制

    剑指 Offer 第2版 面试题 35 复杂链表的复制 剑指 Offer 第2版 面试题 35 复杂链表的复制 解法1 模拟 剑指 Offer 第2版 面试题 35 复杂链表的复制 题目来源 48 复杂链表的复刻 解法1 模拟 算法 复制原