题目:已知两个单链表是否相交,若相交请求出交点。
在前两篇博客的基础上,我们继续完善这道题,判断两个单链表是否相交,若相交我们求出他们的交点,这次我们将考虑带环的情况。
算法与数据结构面试分享(十五)判断两个链表是否有交叉(单链表,不含环)
算法与数据结构面试分享(十六)判断一个单链表是否含环,返回入口点
大体的思路是,首先判断是否带环。
1. 都不带环,但是相交,请看十六。
2. 一个带坏,另一个不带环,这时候场景其实是不存在的。只要相交且一个带环,则两个都带环,即一个带环的链表与另一个不带环的链表相交,其实是不存在的。
3. 两个都带环,这时相交,说明有两个交点。分别是下面两个情况
A: 中间一张图,相交发生在环的入口点之前
B: 最右边一张图,相交发生在环上面
先分析最后一张图,相交发生在环上,其实问题就变成了求两个环的入口点。修改第16篇博客的代码,交点返回值变成一个数组,两个元素,以保证最多可以放两个交点。
再看A这种情况,其实我们要先求环的入口点对吧,然后两个链表的头结点到入口点其实就构成了两个单链表无环的交点了。
但是,我们需要一种共同的接口,同时能处理这两种情况。
以下所有的都是基于两个链表都是环的情况。
1. 求出两个环的入口点
2. 判断入口点是否相等,若等则是情况A,若不等,则可能是B,也可能是两个单独的环
3. 相等的情况A下,我们当做两个无环单链表再处理,最后一个节点是入口点,见十五
4. 不等的情况,
4.1 我们要判断一个单链表中包含另外一个入口点,若包含,则返回两个入口点,即为两交点
4.2 若不包含,则说明不相交,返回空数组
今天就不上代码了哈。更多有关算法的视频教程请访问:
1. 数据结构与算法
欢迎大家关注我们的公众号和QQ群。