当前位置: 首页 > news >正文

【数据结构】面试OJ题——带环链表(数学推论)

 

目录

1.环形链表Ⅰ

​编辑

思路 :

思路拓展 

问题一:

问题二:

总结: 

问题三:

证明总结第三点 

 总结:

2. 环形链表Ⅱ

思路一

思路二 

3.相交链表 

 思路:


 

1.环形链表Ⅰ

141. 环形链表 - 力扣(LeetCode)

给你一个链表的头节点 head ,判断链表中是否有环。

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。

如果链表中存在环 ,则返回 true 。 否则,返回 false 。

思路 :

        我们考虑环状时,如果是简单的循环next来判定,只会进入死循环;

需要引入新思维,判断是否带环,可以想象操场追赶问题,两个人在操场跑;让一个人先进场跑,再让另外一名选手进场,如果环足够大,如何让后入场的选手追赶上前面的;答案是,后来者加快速度。

        而在这道题中,我们用快慢指针概念,一个指针走两步,一个走一步,进入环后,快指针一定会和慢指针相遇

为什么一定会相遇呢?

距离为N,每次快指针走两步,慢指针走一步相当于距离每次减少1;

如此距离缩短,肯定会相遇,而当快慢指针相遇的时候,就是证明该链表带环;

而如果不带环,快指针将链表走完后,表明退出了循环即可; 

 

 

bool hasCycle(struct ListNode *head) {//快慢指针struct ListNode* slow = head;struct ListNode* fast = head;while(fast && fast->next){fast = fast->next->next;slow = slow->next;if(fast == slow){return true;}}return false;
}

思路拓展 

上面说到,距离缩小1一定会追上,那如果距离一次缩小2呢,是不是更快的会相遇呢

如果一次距离缩小n,是不是更快呢;如此延申,我们可以发现有三个拓展

 1. slow一次走一步,fast一次走两步,一定会相遇吗

2.slow一次走一步,fast一次走三步,一定会相遇吗

3.slow一次走n步,fast一次走m步,一定会相遇吗        (m>n>1)

问题一:

 距离缩小为1的话,一定会遇上,我们上面证明了

问题二:

 当slow进环时,fast和它的距离为N,一次减少2。分为两种情况

1.当N是偶数时:

2.当N是奇数时:

所以,我们可以发现,当N是偶数时,依然可以追上

当N是奇数是,得到下一轮:

这时候要看 C-1是奇偶数

如果c-1是偶数:在下一轮就会追上,

如果c-是奇数:则会开始无限循环下去,一直追击不上;

总结: 

1.如果N是偶数,第一轮内就会追上;

2.如果N是奇数,C是奇数,第一轮会错过,下一轮会追击(C是奇数,C-1就会是偶数);

3.如果N是奇数,C是偶数,就永远追不上;

问题三:

 这个类似问题二,每次距离缩小是m-n(>=1);

如果N%(m-n) == 0  说明一圈就可以追上;

如果是-1,则是C-1,-2就是C-2;

如果这个数是m-n的倍数,如果不是倍数,则可能存在死循环        

证明总结第三点 

写到这里时,问题二的 总结第三点,是否真的成立呢?

3.如果N是奇数,C是偶数,就永远追不上;

 此刻,slow走了L的路程,fast走了 L + nC - N; 

在这时,可以推论出公式 

 

 推论出来的这个公式:

2L:一定是偶数,

n*C:总结第三点假设这里是偶数;

N:如果要满足此公式,N就不可能会奇数,

所以, 3.如果N是奇数,C是偶数,就永远追不上;

这句话的条件不成立

 总结:

1.如果N是偶数,第一轮内就会追上;

2.如果N是奇数,C是奇数,第一轮会错过,下一轮会追击(C是奇数,C-1就会是偶数);

只存在这两种

bool hasCycle(struct ListNode *head) {//快慢指针struct ListNode* slow = head;struct ListNode* fast = head;while(fast && fast->next){fast = fast->next->next;slow = slow->next;if(fast == slow){return true;}}return false;
}

 

在这种情况下,该情况其实还可以推论出另一个公式结论 。这就是第二题

2. 环形链表Ⅱ

 142. 环形链表 II - 力扣(LeetCode)

给定一个链表的头节点  head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。

不允许修改 链表。

思路一

 我们依旧用上一道题的画图思路来解决,

第一步先判断是否存在环,

第二部找到入口点;

 

用快慢指针方法,slow走一步,fast走两步

 

struct ListNode *detectCycle(struct ListNode *head) {//快慢指针struct ListNode* slow = head;struct ListNode* fast = head;while(fast && fast->next){fast = fast->next->next;slow = slow->next;if(fast == slow) //相遇了{struct ListNode* meet = slow;while(head != meet)   //起点和相遇点{head = head->next;meet = meet->next;}//找到入口点了return meet;}}return false;
}

思路二 

 这道题还有另外一种解法,就是在相遇点meet这里,将下一个节设为newnode,再将meet->next置NULL,这样就将带环链表问题转换成 相交链表问题

而这种解法自然有相交链表的题;

但是这种解法比较复杂,建议用思路一的

3.相交链表 

160. 相交链表 - 力扣(LeetCode)

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。

题目数据 保证 整个链式结构中不存在环。

注意,函数返回结果后,链表必须 保持其原始结构 。

 

 思路:

题目两种情况,存在相交和不相交,

相交还有前后长短问题;

1.先判断是否有相交点;如果相交,尾节点一定相同;

2.计算两条链表的长度,让长链表先走差距步,这样可以让两条链表处于相同head

3.再让两条链接一起走,直到遇到相同点;

返回相遇点或者是结束链表遍历返回NULL

 

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {struct ListNode* curA = headA,*curB = headB;//计算两条链表长度int lenA = 0;int lenB = 0;while(curA){lenA++;curA = curA->next;}while(curB){lenB++;curB = curB->next;}//算出长度差int n = abs(lenA-lenB);//假设lenA 长于lenBstruct ListNode* longlist = headA,*shortlist = headB;if(lenB>lenA) //假设不成立,交换{longlist = headB;shortlist = headA;}//长的先走差值while(n--){longlist = longlist->next;}//判断是否相等while(longlist != shortlist){longlist = longlist->next;shortlist = shortlist->next; }//到这里要么相等,要么链表不相交,已经走完了是NULLreturn longlist;
}

       

相关文章:

【数据结构】面试OJ题——带环链表(数学推论)

目录 1.环形链表Ⅰ ​编辑 思路 : 思路拓展 问题一: 问题二: 总结: 问题三: 证明总结第三点 总结: 2. 环形链表Ⅱ 思路一 思路二 3.相交链表 思路: 1.环形链表Ⅰ 141. 环形链…...

PostgreSQL中pg_ctl工具的使用

pg_ctl工具有以下功能: (1)初始化postgresql数据库实例 (2)启动、终止或重启postgresql数据库服务 (3)查看postgresql数据库服务的状态 (4)让数据库实例重新读取配置…...

深入理解Kafka3.6.0的核心概念,搭建与使用

Kafka是最初由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实时的处理大量数据以满足各种需求场景&a…...

【python】编程题小代码

空心题(平行四边形) layer int(input("请输入你要打印的行数:")) for i in range(1,layer // 2 2): space_num layer - i for j in range(0,space_num): print(" ",end "") star_num 2 * i - 1 for j in range(0,sta…...

抖音小程序开发全攻略:如何规划项目和选择合适的开发团队

在数字化时代,抖音小程序成为企业推广和服务的重要渠道。本文将为您提供抖音小程序开发的全面攻略,重点介绍如何规划项目和选择合适的开发团队,并附有一些关键的技术代码示例。 1. 项目规划 在开始抖音小程序开发之前,详细的项…...

PSP - 蛋白质复合物结构预测 模版配对(Template Pair) 逻辑的特征分析

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/134328447 在 蛋白质复合物结构预测 的过程中,模版 (Template) 起到重要作用,提供预测结果的关于三维结构的先验信息&…...

喜报不断!箱讯平台获评2023年上海市促进现代航运服务业创新示范项目

近期,可谓捷报频传!在箱讯科技子公司苏州箱讯获评苏州市软件和信息服务业 “头雁”培育企业没过多久,就又迎来好消息! 日前,上海市交通委发布“2023年上海市促进现代航运服务业创新项目”评选结果,箱讯An…...

SOME/IP学习笔记3

目录 1.SOMEIP Transformer 1.1 SOME/IP on-wire format 1.2 协议指定 2. SOMEIP TP 2.1 SOME/IP TP Header 3.小结 1.SOMEIP Transformer 根据autosar CP 相关规范,SOME/IP Transformer主要用于将SOME/IP格式的数据序列化,相当于一个转换器。总体…...

【ATTCK】ATTCK开源项目Caldera学习笔记

CALDERA是一个由python语言编写的红蓝对抗工具(攻击模拟工具)。它是MITRE公司发起的一个研究项目,该工具的攻击流程是建立在ATT&CK攻击行为模型和知识库之上的,能够较真实地APT攻击行为模式。 通过CALDERA工具,安全…...

黑窗口连接远程服务

ssh root192.168.x.x 回车输入密码 查看docker docker ps 停止正在运行的服务 docker stop xxxxx 删除服务 docker rm xxxxx 查看镜像 docker images 删除镜像 docker rmi xxxxx 删除镜像 启动并运行整个服务 docker compose up -d jar包名称 idea 使用tcp方式连接docker 配置d…...

好消息!2023年汉字小达人市级比赛在线模拟题大更新:4个组卷+11个专项,助力孩子更便捷、有效、有趣地备赛

自从《中文自修》杂志社昨天发通知,官宣了2023年第十届汉字小达人市级比赛的日期和安排后,各路学霸们闻风而动,在自己本就繁忙的日程中又加了一项:备赛汉字小达人市级比赛,11月30日,16点-18点。 根据这几年…...

SAP 70策略测试简介

在前面的文章中我们已经测试了10、11、20、40、50、52、60、62策略的测试,接下来我们需要对70策略进行测试,很多的项目中也都会用到70策略。 70策略是一种比较常见的、基于按库存且主要用于半成品或者原材料的计划策略。 我们还是按照之前的惯例,先看下70策略的后台配置 我…...

uniapp+vue3+ts+vite+echarts开发图表类小程序,将echarts导入项目使用的详细步骤,耗时一天终于弄好了

想在uniapp和vue3环境中使用echarts是一件相当前卫的事情,官方适配的还不是很好,echarts的使用插件写的是有些不太清晰的,这里我花费了一天的时间,终于将这个使用步骤搞清楚了,并且建了一个仓库,大家可以直…...

分布式服务器架构的优点有哪些?

在当今数字化时代,随着互联网的普及和技术的不断进步,企业和组织面临着处理越来越多的数据和用户请求的挑战。为了应对这些挑战,分布式服务器架构应运而生。分布式服务器架构通过将任务和数据分散到多个服务器上,提供了许多优点&a…...

Zephyr-7B论文解析及全量训练、Lora训练

文章目录 一、Zephyr:Direct Distillation of LM Alignment1.1 开发经过1.1.1 Zephyr-7B-alpha1.1.2 Zephyr-7B-beta 1.2 摘要1.3 相关工作1.4 算法1.4.1 蒸馏监督微调(dSFT)1.4.2 基于偏好的AI反馈 (AIF)1.4.3 直接蒸馏偏好优化&…...

如何使用群晖虚拟机部署本地网页文件实现公网远程访问?

文章目录 前言1. 安装网页运行环境1.1 安装php1.2 安装webstation 2. 下载网页源码文件2.1 访问网站地址并下载压缩包2.2 解压并上传至群辉NAS 3. 配置webstation3.1 配置网页服务3.2 配置网络门户 4. 局域网访问静态网页配置成功5. 使用cpolar发布静态网页,实现公网…...

初识RabbitMQ - 安装 - 搭建基础环境

RabbitMQ 各个名词介绍 Broker:接收和分发消息的应用,RabbitMQ Server 就是 Message Broker Virtual host:出于多租户和安全因素设计的,把 AMQP 的基本组件划分到一个虚拟的分组中,类似于网络中的 namespace 概念。当…...

C/C++ #运算符、##运算符、变参宏 ...和_ _VA_ARGS_ _

文章目录 用宏参数创建字符串:#运算符函数宏#号作为一个预处理运算符,可以把记号转换成字符串 预处理器粘合剂:##运算符变参宏:...和_ _VA_ARGS_ _参考 用宏参数创建字符串:#运算符 函数宏 下面是一个类函数宏&#…...

【全网首发】【Python】Python控制parrot ARDrone 2.0无人机

🎉欢迎来到Python专栏~Python控制parrot ARDrone 2.0无人机 ☆* o(≧▽≦)o *☆嗨~我是小夏与酒🍹 ✨博客主页:小夏与酒的博客 🎈该系列文章专栏:Python学习专栏 文章作者技术和水平有限,如果文中出现错误…...

DPU国产生态版图又双叒扩大了

DPU朋友圈迎来30新伙伴!近期,中科驭数已与联想、中科可控、统信、欧拉、龙蜥社区、新支点、亚信科技、人大金仓、瀚高、南大通用、GreatSQL、阿里云、曙光云等超30家关键厂商完成兼容性互认证。测试报告显示,中科驭数DPU系列产品在产品兼容性…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...