【数据结构】_链表经典算法OJ:相交链表

ops/2025/2/6 16:52:12/

目录

1.  题目链接及描述

2.  解题思路

2.1 思路1:一个链表把另外一个链表的结点逐个轮一遍

2.2 思路2:截断长链表,从距离交点结点前等距处开始同时遍历(本题解法)

3. 程序

关于解题程序的细节:

3.1 假设法的应用:

3.2 关于链表长度的计算


1.  题目链接及描述

题目链接:160. 相交链表 - 力扣(LeetCode)

题目描述:

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


题目数据 保证 整个链式结构中不存在环。
注意,函数返回结果后,链表必须 保持其原始结构 。

2.  解题思路

拆解题目要求:1、判断是否相交;2、若相交则找出第一个交点;

判断两个单链表是否相交:判断两个链表的尾指针是否相等,相等则相交,不等则不相交

注:1、本题不可逆置:否则在交点结点处存在两个next指针域,;

一个结点不允许存在两个next指针域;

2、判断尾指针相等与否需要用地址判断,不能用val值判断

2.1 思路1:一个链表把另外一个链表的结点逐个轮一遍

为两个链表分别创建结构体指针curNodeA和curNodeB,用第二个链表的每一个结点依次把第一个链表的所有结点都比一遍,直至交点结点处会相等;

时间复杂度O(N^2);

注:两个指针不可同时走,若相交结点前两个链表长度不同,则会导致即使相交也被判定为不相交的情况;

2.2 思路2:截断长链表,从距离交点结点前等距处开始同时遍历(本题解法)

分别计算两个链表的长度,若长度相等则直接从第一个结点处开始同时遍历并依次对比;

长度不等则截断长链表,从与短链表第一个结点到交点结点前处的结点开始同时遍历并依次对比;

时间复杂度O(N);

3. 程序

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
typedef struct ListNode ListNode;
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {ListNode* curNodeA=headA,*curNodeB=headB;// 分别计算两个链表长度int lenA=1,lenB=1;while(curNodeA->next){curNodeA=curNodeA->next;lenA++;}while(curNodeB->next){curNodeB=curNodeB->next;lenB++;}// 两个链表直至遍历到尾结点,指针都不等:两个链表不相等;if(curNodeA != curNodeB){return NULL;}// 令长链表的遍历指针先走差值步,再同时遍历,第一个相等就是交点int gap=abs(lenA-lenB);// 假设法:假设A长B短ListNode* longList=headA,*shortList=headB;// 若假设错误则修正if(lenB>lenA){longList=headB;shortList=headA;}while(gap--){longList=longList->next;}while(longList != shortList){shortList=shortList->next;longList=longList->next;}return shortList;
}

关于解题程序的细节:

3.1 假设法的应用:

当算得两个链表长度后,若链表长度不同,则需要截断长链表。但由于长短链表到底对应A和B哪个链表未知,若采用if(lenA>lenB)和if(lenB>lenA)两大分支则会造成代码的一定重复冗余,可采用假设法:

定义两个结构体变量longList和shortList分别指向长链表和短链表:

先假设A长B短,则将A赋值给LongList,B赋值给shortList。

若假设错误再修正:若lenB>lenA,再将B赋值给LongList,A赋值给shortList;

3.2 关于链表长度的计算

由于需定位到两个链表的尾结点,故循环判断条件应为curNodeX->next而非curNodeX,但当遍历至尾结点时不进入循环,如果将链表长度变量lenX初始值设为0,就会导致链表长度计算少算了尾结点,故而在设定链表长度变量lenX时,将其初始值均设为1;

但其实两个链表的长度即使少算了1,也不会造成影响:链表长度仅用于计算长短链表的差值。


http://www.ppmy.cn/ops/156194.html

相关文章

暴力破解与验证码安全

目录 前言 暴力破解:简单粗暴的黑客攻击手段 暴力破解的前提条件 暴力破解的定义与原理 常见的暴力破解工具 暴力破解的常见场景 暴力破解的危害 验证码:抵御暴力破解的第一道防线 验证码的定义与作用 验证码的工作原理 验证码的类型 验证码…

JDK17主要特性

JDK 17,也被称为Java 17或Java Platform, Standard Edition 17,是Java编程语言的第十七个主要版本,由Oracle公司在2021年9月发布。Java 17是一个长期支持(LTS,Long-Term Support)版本,这意味着它…

蓝桥杯之c++入门(一)【C++入门】

目录 前言5. 算术操作符5.1 算术操作符5.2 浮点数的除法5.3 负数取模5.4 数值溢出5.5 练习练习1:计算 ( a b ) ⋆ c (ab)^{\star}c (ab)⋆c练习2:带余除法练习3:整数个位练习4:整数十位练习5:时间转换练习6&#xff…

【论文投稿-第八届智能制造与自动化学术会议(IMA 2025)】HTML, CSS, JavaScript:三者的联系与区别

大会官网:www.icamima.org 目录 前言 一、HTML(超文本标记语言):网页的骨架 HTML 的作用: 例子: 总结: 二、CSS(层叠样式表):网页的外观设计 CSS 的…

Kafka分区策略实现

引言 Kafka 的分区策略决定了生产者发送的消息会被分配到哪个分区中,合理的分区策略有助于实现负载均衡、提高消息处理效率以及满足特定的业务需求。 轮询策略(默认) 轮询策略是 Kafka 默认的分区策略(当消息没有指定键时&…

2021Java面试-基础篇

文章目录 前言一: Java概述 1、何为编程2、JDK1.5之后的三大版本3、JVM,JRE和JDK的关系4、什么是跨平台?原理是什么5、Java语言有哪些特点6、什么是字节码?采用字节码的最大好处是什么7、什么是Java程序的主类?应用程序和小程序的…

深度学习中,文本分类任务怎么做

一、处理流程 前置步骤: 标注数据得到数据集数据清理:将特殊字符、特殊格式、无效字符去除 正式步骤: 1、分词或分字:英文一般都分词,中文有分词也有分字。分词还是分字取决于你模型的embedding。 2、将字或词编辑ID…

LLM推理--vLLM解读

主要参考: vLLM核心技术PagedAttention原理 总结一下 vLLM 的要点: Transformer decoder 结构推理时需要一个token一个token生成,且每个token需要跟前序所有内容做注意力计算(包括输入的prompt和该token之前生成的token&#xf…