链表OJ----相交链表找交点

2024-01-25 01:04
文章标签 链表 相交 交点 oj

本文主要是介绍链表OJ----相交链表找交点,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

https://leetcode.cn/problems/intersection-of-two-linked-lists/description/

        e29fad781ff343f498f54a15cc7a2276.png

         1、长链表先走,然后二者一起走

        由于两个链表可能不一样,就不好控制移动。那么我们可以让长的链表先走二者的长度差的长度,使剩下部分和短链表一样长。然后二者一起走动,去寻找交点。

2db40b53314f491aaa5424aff5a6d039.png

struct ListNode* getIntersectionNode(struct ListNode* headA,struct ListNode* headB) {if (headA == NULL || headB == NULL)return NULL;int lenA = 1,lenB =1; //记录长度,由于二者此时不为空链表,并且我们要找到最后一个结点,而不是空结点,所以这里起始长度为1struct ListNode *pa = headA, *pb = headB;while (pa->next != NULL) //找最后一个结点{lenA++;pa = pa->next;}while (pb->next != NULL) //找最后一个结点{lenB++;pb = pb->next;}if (pa != pb) //判断最后一个结点是否相等return NULL;int dis = abs(lenA - lenB);if (lenA > lenB) // A走{while (dis > 0) {headA = headA->next;dis--;}} else // B走{while (dis > 0) {headB = headB->next;dis--;}}//一起走while (headA != headB) {headA = headA->next;headB = headB->next;}//如果找到就返回headA//如果没找到,那么二者最终都为NULLreturn headA;
}

        2、逆置链表

        虽然题目说不能改变链表结构,但逆置链表也是一种办法,我们可以参考。代码就不写了,看看分析图即可。

9b79e71199264ee2bbd0927e97dd3b94.png

        3、双指针法

        ​​​​​​​

         下面我们来验证一下思路是否正确:

        假设headA长为a,headB长为b:

        情况1:假设a == b,pa和pb都走了x的长度(x<a),此时pa == pb != NULL,则交点找到;假设pa和pb都走了a的长度,此时pa == pb == NULL,则没有交点。

        情况2:假设a!=n,pa先走了a,再走x(x<b),pb先走了b,再走y(y<a),此时pa == pb != NULL,则交点找到;如果x == b,y == a,则pa走了a+b,pb走了a+b,此时pa == pb == NULL,则没有交点。

struct ListNode* getIntersectionNode(struct ListNode* headA,struct ListNode* headB) {if (headA == NULL || headB == NULL)return NULL;struct ListNode *pa = headA, *pb = headB;
//如果pa == pb != NULL,就是找到交点,结束循环 
//当pa ==pb == NULL,要么是两个一样长的链表,各自都走完了,但是没有交点;要么是pa和pb都将链表AB走了一遍while (pa != pb){if (pa == NULL) {pa = headB;} else {pa = pa->next;}if (pb == NULL) {pb = headA;} else {pb = pb->next;}}return pa;
}

这篇关于链表OJ----相交链表找交点的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/641619

相关文章

csu1329(双向链表)

题意:给n个盒子,编号为1到n,四个操作:1、将x盒子移到y的左边;2、将x盒子移到y的右边;3、交换x和y盒子的位置;4、将所有的盒子反过来放。 思路分析:用双向链表解决。每个操作的时间复杂度为O(1),用数组来模拟链表,下面的代码是参考刘老师的标程写的。 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#

poj 1127 线段相交的判定

题意: 有n根木棍,每根的端点坐标分别是 px, py, qx, qy。 判断每对木棍是否相连,当他们之间有公共点时,就认为他们相连。 并且通过相连的木棍相连的木棍也是相连的。 解析: 线段相交的判定。 首先,模板中的线段相交是不判端点的,所以要加一个端点在直线上的判定; 然后,端点在直线上的判定这个函数是不判定两个端点是同一个端点的情况的,所以要加是否端点相等的判断。 最后

深入手撕链表

链表 分类概念单链表增尾插头插插入 删尾删头删删除 查完整实现带头不带头 双向链表初始化增尾插头插插入 删查完整代码 数组 分类 #mermaid-svg-qKD178fTiiaYeKjl {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-

zoj 1721 判断2条线段(完全)相交

给出起点,终点,与一些障碍线段。 求起点到终点的最短路。 枚举2点的距离,然后最短路。 2点可达条件:没有线段与这2点所构成的线段(完全)相交。 const double eps = 1e-8 ;double add(double x , double y){if(fabs(x+y) < eps*(fabs(x) + fabs(y))) return 0 ;return x + y ;

圆与线段的交点

poj 3819  给出一条线段的两个端点,再给出n个圆,求出这条线段被所有圆覆盖的部分占了整条线段的百分比。 圆与线段的交点 : 向量AB 的参数方程  P = A + t * (B - A)      0<=t<=1 ; 将点带入圆的方程即可。  注意: 有交点 0 <= t <= 1 ; 此题求覆盖的部分。 则 若求得 t  满足 ; double ask(d

建立升序链表

题目1181:遍历链表 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2744 解决:1186 题目描述: 建立一个升序链表并遍历输出。 输入: 输入的每个案例中第一行包括1个整数:n(1<=n<=1000),接下来的一行包括n个整数。 输出: 可能有多组测试数据,对于每组数据, 将n个整数建立升序链表,之后遍历链表并输出。 样例输

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

学习记录:js算法(二十八):删除排序链表中的重复元素、删除排序链表中的重复元素II

文章目录 删除排序链表中的重复元素我的思路解法一:循环解法二:递归 网上思路 删除排序链表中的重复元素 II我的思路网上思路 总结 删除排序链表中的重复元素 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 图一 图二 示例 1:(图一)输入:head = [1,1,2]输出:[1,2]示例 2:(图

求空间直线与平面的交点

若直线不与平面平行,将存在交点。如下图所示,已知直线L过点m(m1,m2,m3),且方向向量为VL(v1,v2,v3),平面P过点n(n1,n2,n3),且法线方向向量为VP(vp1,vp2,vp3),求得直线与平面的交点O的坐标(x,y,z): 将直线方程写成参数方程形式,即有: x = m1+ v1 * t y = m2+ v2 * t

【数据结构与算法 | 灵神题单 | 删除链表篇】力扣3217, 82, 237

总结,删除链表节点问题使用到列表,哈希表,递归比较容易超时,我觉得使用计数排序比较稳,处理起来也不是很难。 1. 力扣3217:从链表中移除在数组中的节点 1.1 题目: 给你一个整数数组 nums 和一个链表的头节点 head。从链表中移除所有存在于 nums 中的节点后,返回修改后的链表的头节点。 示例 1: 输入: nums = [1,2,3], head = [1,2,3,