【链表OJ】常见面试题 3

news2024/11/24 12:12:38

文章目录

  • 1.[环形链表II](https://leetcode.cn/problems/linked-list-cycle-ii/description/)
  • 1.1 题目要求
    • 1.2 快慢指针
    • 1.3 哈希法
  • 2.[随机链表的复制](https://leetcode.cn/problems/copy-list-with-random-pointer/description/)
    • 2.1 题目要求
    • 2.2 迭代法

1.环形链表II

环形链表II

1.1 题目要求

找到环形链表的入口并返回该节点,如果找不到就返回NULL。

1.2 快慢指针

在话 环形链表I中我们就用到了,快慢指针来判断一个链表中是否存在环。在环形链表I中已经解释了为什么会相遇。可是现在的问题是找到环的入口,我们的快慢指针好像做不到吧。
别急嘛,下面我将用数学的方式来证明可以做到!
数学证明
初始时,快慢指针都在链表的起始位置,在指针开始运动前我们要了解,快指针的速度的慢指针的两倍,也就说明了快指针的运动的路程是慢指针的两倍
定义快指针为红色箭头,慢指针为蓝色箭头。
起始

运动开始,当运动到慢指针刚好进入到环中时,快指针已经在环中运动了k圈了(k>=0
慢指针开始入环

此时的慢指针在A点,快指针在B点。AB距离为x,BA距离为y慢指针运动路程为z,快指针运动距离为k*(x+y)+x
根据快指针的运动路程是慢指针的两倍可得

2*z = k*(x+y)+x;
化简为
z = k*(x+y)+x

将图中的z替换得:
过渡

下面就是快慢指针相遇时刻,根据图中得距离BA为y,因为快指针的速度是慢指针的两倍,那么就说明了它们的相遇时刻是慢指针再运动y距离的时刻,此时的快指针运动了2y
快指针与慢指针相遇

现在它们相遇了,从图中观察,AC的距离为x。然后环的大小为x+y,以及从head到A的距离为x+k(x+y),这不就说明了,我们只要派出一个慢指针从head运动到A不就可以了吗,让环慢指针在环中转k圈,环外的慢指针也运动了k(x+y)的距离,此时它们离A都只差x,同时速度又是一样,由此两个慢指针是会在A点相遇的。

证明过程中的图片来源:Shawxing精讲算法

struct ListNode *detectCycle(struct ListNode *head) {
    struct ListNode* fast = head;
    struct ListNode* slow =head;
    while(fast&&fast->next)
    {
        fast = fast->next->next;
        slow = slow->next;
        if(slow == fast)
        {
            struct ListNode* cur = head;
            while(cur!=slow)
            {
                cur = cur->next;
                slow = slow->next;
            }
            if(cur==slow)
                return cur;
        }
    }
    return NULL;
}

1.3 哈希法

利用哈希表unordered_map来存储链表的每个节点,链表存在环时,一定会有重复的节点进入哈希表,我们只要关注第一个重复加入哈希表的节点即可。

用c写很麻烦,代码我用c++写的。

class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        unordered_map<ListNode*,bool> cnt;
        ListNode* cur = head;
        while(cur)
        {
            if(cnt.find(cur)!=cnt.end())
            {
                return cur;
            }
            cnt[cur] = true;
            cur = cur->next;
        }
        return nullptr;
    }
};

2.随机链表的复制

随机链表的复制

2.1 题目要求

创建一个新链表,这个新链表所有的节点、next链接和random链接都要与原链表完全相同,返回新链表的头。

2.2 迭代法

先创建和原链表值相同的节点,让原链表中的节点指向新创建的节点前,用新创建的节点指向原节点的下一个节点。
copy节点的创建

处理random
在把cur指向head,重新遍历链表,因为原本的链表因为新节点的加入有所改变,当时我们还是要让cur每次都指向原链表的节点,再创建一个copy指向新加入的链表。
因为一一配对的原因,我们只需要让copy节点指向原先节点指向的random的下一个节点就可以了就可以,不过有个例外就指向NULL的节点,特别判断一下就可以了
copy的random的指向

链接copy节点
把copy指向原链表节点的指针统统指向copy节点就可以了
copy节点最后的链接

struct Node* copyRandomList(struct Node* head) {
	struct Node* cur = head;
    while(cur)
    {
        struct Node* copy = (struct Node*)malloc(sizeof(struct Node));
        copy->val = cur->val;
        copy->next = cur->next;
        cur->next = copy;
        copy->random = NULL;
        cur = copy->next;
    }
    cur = head;
    while(cur)
    {
        struct Node* copy = cur->next;
        struct Node* next = copy->next;
        if(cur->random == NULL)
            copy->random = NULL;
        else
            copy->random = cur->random->next;
        cur = next;
    }
    //链接copy节点
    struct Node* phead = NULL;
    struct Node* tail = NULL;
    cur = head;
    while(cur)
    {
        struct Node* copy = cur->next;
        struct Node* next = copy->next;
        if(phead == NULL)
        {
            phead = copy;
            tail = phead;
        }
        else
        {
            tail->next = copy;
            tail = copy;
        }
        cur = next;
    }
    return phead;
}

那么关于链表题目的讲解就先到此为止了,如果大家对链表的题目还是很感兴趣下去以后可以刷这里的题:力扣链表和牛客链表的题目

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

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

相关文章

KEIL5芯片包下载

一、打开KEIL芯片包下载网址 Arm Keil | Devices 二、搜索要下载的芯片型号 三、安装

CSP初赛知识点讲解(二)

CSP初赛知识点讲解&#xff08;二&#xff09; 进制转换基本定义n进制转十进制十进制转n进制n进制转m进制小数的进制转换 例题训练&#xff08;四&#xff09; 进制转换 基本定义 十进制&#xff1a;逢十进一(包含数字0~9) ( 365 ) 10 3 1 0 2 6 1 0 1 5 1 0 0 (365)_{…

如何提高编程能力?(来自准大三学长的含泪建议)

种一棵树最好是十年前&#xff0c;其次是现在 想了解更多内容可以看我主页&#xff1a;GGBondlctrl-CSDN博客 1.前言 以下是小编的亲身经历哟 &#xff08;1&#xff09;大一&#xff0c;摆烂 -------和每个人一样&#xff0c;大学都是带着美好的憧憬&#xff0c;我开始学习…

Apache漏洞

四、 CVE-2021-41773 Apache HTTP Server 路径穿越漏洞 漏洞简介 该漏洞是由于Apache HTTP Server 2.4.49版本存在目录穿越漏洞,在路径穿越目录<Directory/>Require all granted</Directory>允许被访问的的情况下(默认开启)攻击者可利用该路径穿越漏洞读取到Web…

C++ 基础练习 - Chapter 12 (基础练习 完结版)

Review Questions 12.1 What is generic Programming? How is it implemented in C? Answer: Generic programming is an approach where generic types are used as parameters in algorithms so that they work for variety of suitable data types and data structures…

【Spring】通过Aspects实现面向切面编程(AOP)

目录 1.概念理解 2. 案例说明 1.概念理解 【注】一些概念来自&#xff1a;https://blog.csdn.net/Kaiser__/article/details/135894150 横切关注点 分散在每个各个模块中解决同一样的问题&#xff0c;如用户验证、日志管理、事务处理、数据缓存都属于横切关注点。这个概念不是…

【C++刷题】优选算法——贪心第一辑

什么是贪心算法 贪心策略&#xff1a;局部最优 -> 全局最优 “贪婪鼠目寸光” 1、把解决问题的过程分为若干步 2、解决每一步的时候&#xff0c;都选择当前看起来“最优的”解法 3、“希望”得到全局最优解 贪心算法的特点 贪心策略的提出是没有标准或者模板的 正确的贪心策…

项目小结(中)

一.文件分片上传 在文件上传的逻辑中&#xff0c;文件以MD5唯一&#xff0c;然后记录已经储存的文件md5&#xff0c;如果已上传&#xff0c;就秒传&#xff0c;并记录班级上传文件信息。 如果请求文件上传时&#xff0c;发现班级已经上传了一部分&#xff0c;这里就会把班级上…

秋招复习笔记——八股文部分:网络IP

终于来到了网络的最后一篇&#xff0c;继续加油&#xff01; IP 知识全家桶 IP 基本认识 IP 在 TCP/IP 参考模型中处于第三层&#xff0c;也就是网络层。 网络层的主要作用是&#xff1a;实现主机与主机之间的通信&#xff0c;也叫点对点&#xff08;end to end&#xff09…

【Vue3】Pinia修改数据

【Vue3】Pinia修改数据 背景简介开发环境开发步骤及源码总结 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努力学习奋斗的日子…

锐捷RCNA | 远程登录与路由技术

锐捷RCNA | 远程登录与路由技术 一、远程登录配置1. Telnet远程登录介绍2. 案例1--设置远程登录密码实现远程登录3. 案例2--定义不同用户账户实现远程用户权限隔离4. SSH远程登录介绍5. 案例--通过SSH功能远程管理设备 二、路由技术1. 直连路由的数据通信2. 间接路由的数据通信…

标准IO

fprintf和fscanf fprintf int printf(const char *format, ...); 把数据输出到终端 int fprintf(FILE *stream, const char *format, ...); 功能&#xff1a; 将format字符串中的内容&#xff0c;输出到stream文件流指针指向的文件中去&#xff0c;想要将数据以何种形式输…

基于XxlCrawler的Java执行JS渲染方式实战-以获取商飞C919飞行照片为例

目录 前言 一、抓取目标解析 1、原始网站介绍 2、列表页面结构解析 二、XxlCrawler的常规配置 1、PageVo对象的定义 2、定义XxlCrawler并启动 三、使用HtmlUnit来执行动态渲染 1、在pom.xml中加入htmlunit的引用 2、设置PageLoader加载器 3、执行抓取 四、总结 前言…

看,esp8266就是这么简单

材料准备 1.esp 8266 2.一条可以传输数据的数据线 3一台电脑 前言 如今是物联网的时代&#xff0c;例如“智能家居&#xff0c;无人驾驶……”&#xff0c;多方面的进行物联网改革与创新。那其中&#xff0c;物联网主要的是联网。那通常都是以“esp 8266”和“esp 32”占据了…

在Kylin服务器安装PostgreSQL16数据库

1、下载PostgreSQL16安装包 下载地址https://www.postgresql.org/ftp/source/v16.3/ 2、安装依赖和ICU库 查看服务器版本 yum install -y perl-ExtUtils-Embed readline-devel zlib-devel pam-devel libxml2-devel libxslt-devel openldap-devel python-devel gcc-c opens…

在抖音做电商推广,货架场非做不可

前一段时间跟几个做电商的朋友聊天&#xff0c;我发现大家的干劲儿还挺满的&#xff0c;讨论的话题也出奇地一致&#xff1a;要找新增量。 其中有个朋友是做服装品类的&#xff0c;做得还不错。我请教他秘诀&#xff0c;他说&#xff1a;做电商&#xff0c;推广拿量非常关键。…

MySQL笔记(七):索引

一、索引优化速度 创建对应字段的索引&#xff0c;只对该列有效&#xff0c;只能提高该列的查询速度 创建索引后&#xff0c;查询速度变快&#xff0c;但是表占用空间变大 create index 索引名 on 表名(需要创建索引的列)二、索引的原理 普通索引允许该字段重复 全文索引&#…

Resize Observer监测DOM元素尺寸改变的神器

前言 大家在遇到需要监测DOM元素尺寸大小的需求时&#xff0c;可能第一时间想到的都是使用window.addEventListener来监听resize 事件&#xff0c; 但是reize事件会在一秒内触发将近60次&#xff0c;所以很容易在改变窗口大小时导致性能问题。因为它会监听我们页面每个元素的…

MySQL总体功能

基于Innodb存储引擎的讨论 MySQL 核心功能 功能解决的问题ACID模型数据并发访问&#xff0c;和奔溃恢复安全问题,一致性&奔溃恢复索引数据查询效率问题备份容错设计,解决硬件错误带来的问题复制数据迁移监控执行数据库操作的异常记录

《嵌入式 - 嵌入式大杂烩》ARM Cortex-M寄存器详解

1 ARM Cortex-M寄存器概述 ARM Cortex-M提供了 16 个 32 位的通用寄存器(R0 - R15),如下图所示。前15个(R0 - R14)可以用作通用的数据存储,R15 是程序计数器 PC,用来保存将要执行的指令。除了通用寄存器,还有一些特殊功能寄存器。特殊功能寄存器有预定义的功能,而且必须通…