【数据结构】链表练习题(2)

链表练习题

  • 1.相交链表(LeetCode160)
  • 2.环形链表(LeetCode141)
  • 3.环形链表Ⅱ(LeetCode142)


1.相交链表(LeetCode160)

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。题目数据 保证 整个链式结构中不存在环。注意,函数返回结果后,链表必须 保持其原始结构 。OJ链接在这里插入图片描述 思路
首先,我们得判断这两个链表是否相交。如果两个链表相交,他们的尾节点的地址一定相同。想得到两个链表相交的第一个节点,有两种方法。
法1:假设a链有m个节点,b链有n个节点。用一个指针pa指向a的节点,用另一个指针pb来遍历b链,逐一判断地址是否相等。如果相等,返回这个节点的地址,不相等就让pa指向a的下一个节点,让pb继续遍历链,继续判断地址是否相等。但是这种方法的时间复杂度是O(mn);
法2:(1)分别求两链表的长度,得出两链表的长度差,顺便判断是否相交;(2)长链表先走差距步;(3)同时走,第一个地址相同的节点就是交点。时间复杂度是O(n),空间复杂度是O(1)。

//法2
struct ListNode 
{
	int val;
	struct ListNode* next;	
}; 
struct ListNode* getIntersectionNode(struct ListNode* headA, struct ListNode* headB)
{
	struct ListNode* tailA = headA, * tailB = headB;
	int lenA = 1, lenB = 1;//为什么是1?因为当tailA和tailB指向尾节点时,停止循环,len少算了一次
	while (tailA->next )//为什么当tailA指向尾节点时停止循环?因为我们要判断两链表是否相交,需要尾节点的地址
	{
		lenA++;
		tailA = tailA->next;
	}
	while (tailB->next )
	{
		lenB++;
		tailB = tailB->next;
	}
	if (tailA != tailB)
	{
		return NULL;
	}
	int gap = lenA - lenB;//假设A比B长
	struct ListNode* longList = headA;
	struct ListNode* shortList = headB;
	if (lenA < lenB)
	{
		gap = lenB - lenA;
		longList = headB;
		shortList = headA;
	}
	while (gap--)//长链表先走gap步
	{
		longList = longList->next;
	}
	while (longList != shortList)
	{
		longList = longList->next;
		shortList = shortList->next;
	}
	return longList;
}

2.环形链表(LeetCode141)

给你一个链表的头节点 head ,判断链表中是否有环
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。
如果链表中存在环 ,则返回 true 。 否则,返回 false 。OJ链接
在这里插入图片描述
思路
使用快慢指针,慢指针走一步,快指针走两步,如果是环形链表,最终两指针会在环内相遇,这时就代表链表是环形链表。
代码

struct ListNode 
{
	int val;
	struct ListNode* next;	
};
bool hasCycle(struct ListNode* head)
{
	struct ListNode* slow = head, * fast = head;
	while (fast && fast->next)//如果没有环,fast最先指向NULL,或者fast->next指向NULL
	{
		fast = fast->next->next;
		slow = slow->next;
		if (fast == slow)
		{
			return true;
		}
	}
	return false;
}

疑惑
(1)为什么slow走一步,fast走两步,最终会相遇?会不会错过?
在这里插入图片描述
(2)如果slow走m步,fast走n步,是否会相遇?
在这里插入图片描述


3.环形链表Ⅱ(LeetCode142)

给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。
不允许修改 链表。OJ链接
在这里插入图片描述
知识准备
在这里插入图片描述
思路
(法1)根据以上的知识准备,我们可以先用快慢指针求出相遇点,然后让一个指针从起始点出发,另一个指针从相遇点出发,当它们相等时就可以得出入环的第一个结点。
(法2)利用快慢指针求出相遇点后,将相遇点与下一个结点断开,将问题转换成求两个链表的第一个交点。
代码

//法1
struct ListNode 
{
	int val;
	struct ListNode* next;	
};
struct ListNode* detectCycle(struct ListNode* head)
{
	struct ListNode* slow = head, * fast = head;
	while (fast && fast->next)
	{
		slow = slow->next;
		fast = fast->next->next;
		if (slow == fast)
		{
			struct ListNode* meet = slow;
			struct ListNode* start = head;
			while (meet != head)
			{
				meet = meet->next;
				start = start->next;
			}
			return meet;
		}
	}
	return NULL;
}
//法2
struct ListNode
{
	int val;
	struct ListNode* next;
};
struct ListNode* getIntersectionNode(struct ListNode* headA, struct ListNode* headB)
{
	struct ListNode* tailA = headA, * tailB = headB;
	int lenA = 1, lenB = 1;//为什么是1?因为当tailA和tailB指向尾节点时,停止循环,len少算了一次
	while (tailA->next)//为什么当tailA指向尾节点时停止循环?因为我们要判断两链表是否相交,需要尾节点的地址
	{
		lenA++;
		tailA = tailA->next;
	}
	while (tailB->next)
	{
		lenB++;
		tailB = tailB->next;
	}
	if (tailA != tailB)
	{
		return NULL;
	}
	int gap = lenA - lenB;//假设A比B长
	struct ListNode* longList = headA;
	struct ListNode* shortList = headB;
	if (lenA < lenB)
	{
		gap = lenB - lenA;
		longList = headB;
		shortList = headA;
	}
	while (gap--)//长链表先走gap步
	{
		longList = longList->next;
	}
	while (longList != shortList)
	{
		longList = longList->next;
		shortList = shortList->next;
	}
	return longList;
}
struct ListNode* detectCycle(struct ListNode* head)
{
	struct ListNode* slow = head, * fast = head;
	while (fast && fast->next)
	{
		slow = slow->next;
		fast = fast->next->next;
		if (slow == fast)
		{
			struct ListNode* meet = slow;
			struct ListNode* list1 = meet->next;
			struct ListNode* list2 = head;
			meet->next = NULL;
			return getIntersectionNode(list1, list2);
		}
	}
	return NULL;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

spring注解的使用

Spring的一个核心功能是IOC&#xff0c;就是将Bean初始化加载到容器中&#xff0c;Bean是如何加载到容器的&#xff0c;可以使用Spring注解方式或者Spring XML配置方式。 Spring注解方式减少了配置文件内容&#xff0c;更加便于管理&#xff0c;并且使用注解可以大大提高了开发…

你看这个spring的aop它又大又宽

aop&#x1f693;AOP 分类AspectJ | 高级但是难用Spring AOP | 易用但仅支持方法aop 原理明月几时有&#xff0c;把酒问青天。——唐代李白《将进酒》 AOP 分类 在 Spring Boot 中&#xff0c;AOP 的实现主要有以下几种&#xff1a; 基于 AspectJ 的 AOP&#xff1a;这是一种基…

数据结构——红黑树

目录 概念 性质 结点的定义 插入 调整 当p是g的左孩子时 当p为g的右孩子时 插入完整代码 红黑树的检测 红黑树完整代码&#xff08;包括测试数据&#xff09; 概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&…

如何有效备考PMP?

随着PMP证书含金量直线上升&#xff01;现在PMP证书就跟黄金一样&#xff0c;即保值又升值。 今天小编应势出一篇关于如何高效备考PMP的方法&#xff0c;在备考生快过来看看吧&#xff01; 1、准备好所需要的教材&#xff0c;视频&#xff0c;试题内容 备考备考&#xff0c;你…

蓝桥杯刷题冲刺 | 倒计时5天

作者&#xff1a;指针不指南吗 专栏&#xff1a;蓝桥杯倒计时冲刺 &#x1f43e;马上就要蓝桥杯了&#xff0c;最后的这几天尤为重要&#xff0c;不可懈怠哦&#x1f43e; 文章目录1.方格迷宫2.字符串删减1.方格迷宫 题目 链接&#xff1a; 4943. 方格迷宫 - AcWing题库 给定一…

Sam Altman专访:GPT-4没太让我惊讶,ChatGPT则让我喜出望外

导读ChatGPT、GPT-4 无疑是 2023 年年初人工智能界最大的「爆款」。3 月 26 日&#xff0c;OpenAI CEO、ChatGPT 之父 Sam Altman 接受了著名学者与科技播客、麻省理工大学研究员 Lex Fridman 的专访&#xff0c;Sam 分享了从OpenAI内部视角如何看待ChatGPT和GPT-4的里程碑式意…

分享:数据库存储与索引技术(三)LSM树实现案例

欢迎访问 OceanBase 官网获取更多信息&#xff1a;https://www.oceanbase.com/ 本文来自OceanBase社区分享&#xff0c;仅限交流探讨。原作者马伟&#xff0c;长期从事互联网广告检索系统的研发&#xff0c;对数据库&#xff0c;编译器等领域也有浓厚兴趣。 文章目录1. MemTab…

2.2.2 第2遍:程序细节

这段话主要解释了C程序中#include指令和头文件的作用。头文件包含了编译器所需的信息&#xff0c;例如函数名、常量、以及如何使用它们等。在C程序中&#xff0c;头文件通常用于包含库函数&#xff0c;例如stdio.h文件中包含了输入和输出函数&#xff08;如printf()&#xff09…

LCHub:ChatGPT4和低代码来临,程序员面临下岗?

一个网友吐槽道: “ 建站出来了,你们说程序员会失业。 低代码出来了,你们说程序员会失业。 Copilot出来了,你们说程序员会失业。 Chatgpt出来了,你们说程序员会失业 虽然这只是网友的吐槽,但却引起了小编的好奇。为何程序员那么容易被新技术取代?今天小编打算跟大家…

Waline在Butterfly主题中的应用

LeanCloud 设置 (数据库) 国内版的LeanCloud需要绑定域名&#xff0c;所以我们直接选择国外版的LeanCloud 登陆注册 注册&#xff1a;点击这里进行跳转注册成功后进入控制台&#xff0c;选择 创建应用 。 创建完成后进入应用&#xff0c;下拉找到 设置 , 会有 AppID 、AppK…

ASO优化之应用商店关键词的实现

投放正确的合适的关键词&#xff0c;能够确保我们的应用获得更高的相关性和知名度。如果我们已经完成研究并想要竞争目标关键词&#xff0c;就需要在商品详情中去实施投放它们。 要在 Google Play Store 中投放——我们要打开 Google Play 控制台并点击“主要应用详情”选项卡…

基于模型预测控制(MPC)的微电网调度优化的研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

VMware创建和使用虚拟网络

文章目录如何打开虚拟网络编辑器让虚拟机使用有线、无线网卡1. 点击“添加网络”2. 虚拟机使用电脑自带无线网卡3. 虚拟机使用电脑自带有线网卡重置虚拟网络在使用虚拟机的过程中&#xff0c;有时会需要让虚拟机使用物理机的网络设备直接与外部连接&#xff0c;例如让虚拟机通过…

Win11启用IE方法

呉師傅 Win11是微软目前的最新系统&#xff0c;尽管该系统非常不错&#xff0c;但是还是有很多不一样的地方&#xff0c;有的用户发现Win11没有了IE浏览器&#xff0c;那么Win11没有IE浏览器怎么办呢&#xff0c;有的旧网页需要IE浏览器才能进入&#xff0c;下面就给大家提供一…

怎么把两个音频合成一个

在创作音乐、制作视频等领域&#xff0c;经常需要将音频文件进行合并处理&#xff0c;但对于没有专业工具和知识的朋友来说&#xff0c;音频合并可能是一项复杂的任务。本篇文章就要为大家介绍合并音频的方法&#xff0c;让大家能够快速地将音频文件合并成需要的部分&#xff0…

leaflet: 地图上叠加日夜区域(126)

第126个 点击查看专栏目录 本示例的目的是介绍如何在vue+leaflet中显示日夜交替叠加区域。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共68行)安装插件相关API参考:专栏目标示例效果 配置方式 1)查看基础设…

ChatGPT能胜任高级程序员吗?

与开发人员信任的其他软件开发工具不同&#xff0c;AI工具在训练、构建、托管和使用方式等方面都存在一些独特的风险。 自2022年底ChatGPT发布以来&#xff0c;互联网上便充斥着对其几乎相同比例的支持和怀疑的论调。不管你是否喜欢它&#xff0c;AI正在逐步进入你的开发组织。…

【设计模式】Bridge Design pattern 桥接模式

1.桥接模式要解决的问题 多个维度的变化引起的继承组合指数级增长 例子 一个物体有不同形状和不同颜色&#xff0c;如何用类来表示它们&#xff0c;这里包含了两个变化维度&#xff0c;一个是物体的形状&#xff0c;一个是颜色 继承的方式 如果使用继承的方式&#xff0c;此…

抖音seo优化系统常见的交付形式|技术开发

1. 一次性交付&#xff1a;将整个SEO优化系统一次性交付给客户&#xff0c;包括相关的文档、工具和数据分析报告&#xff0c;由客户自行操作和维护。 2. 阶段性交付&#xff1a;将SEO优化系统分为不同的阶段进行交付&#xff0c;每个阶段完成后进行检查和评估&#xff0c;根据…

2. [手把手教你搭建] 之 在linux上搭建mysql

1. 首先下载mysql安装包&#xff0c;这里一般有如下2种下载方式 wgt方式下载&#xff1a;进入服务器中的package目录&#xff08;注&#xff1a;该目录是我自己创建的&#xff0c;用于存放所有应用的安装包&#xff0c;您也可以随便创建其他名称的目录来存放安装包&#xff09…
最新文章