漫画:单链表相交问题

linglingling,why星球计算机二班开始上课了。

老师:同学们好,上节课讲了如何判断环形单链表的问题,那么如何判断两个单链表是否有交点呢?首先,链表分有环和无环两种,我先来分析一种简单情况,假设两个链表是无环的。我们来看一下两个无环的单链表有哪些相交情况。(注明:每个节点均有数据和指针)

情况一:(平行)

情况二:(相交)

好,那么谁来说一下。

同学们纷纷举了手,小白你来说一下。

小白:

两层循环,外层循环循环第一个链表的每一个节点,内层循环循环第二个链表的每一个节点,然后和外层循环的当前节点进行比较,如果有相等的则说明两个链表有交点。

老师:很好,这样做可以判断时候有交点问题。但是效率并不高,遍历两次时间复杂度o(n^2),由于没有开辟额外的空间,所以空间复杂度o(1)。哪位同学有更好的方法。

同学们纷纷举了手,小红你来说说。

小红:

循环第一个链表把第一个链表的每个节点放到hashset里,循环第二个链表,看当前节点是否存在第一个链表保存的hashset中,如果存在,则存在交点。

老师:很好,虽然时间复杂度虽然降低为o(n^1),但是由于开辟了和链表单独相关的n的空间,所以空间复杂度o(n)。那有没有时间复杂度是o(n^1),空间复杂度o(1)的呢。谁来说一下。

此时举手的少了一些。好,课带表来。

课带表:

最后一个交点相等。声明两个尾节点,同时循环两个链表,如果没有下一个节点,赋值给当前的尾节点。比较这两个尾节点,如果相同则说明有交点。

老师:很好,我们上节课学习判断链表是否有环的方法,能不能利用这个方法进行判断呢?

学委:

让链表一的尾指针指向链表二的头指针,如果存在环,则说明有交点。

老师:大家要集思广益啊,问题解法不止有一种哦,谁还有其他的想法都可以说说哈。

小白:

先求出两个链表分别的长度,长度相减,让长的先走 s1 - s2,然后两个链表继续向前走,如果遇到相同的节点则说明两个链表有交点。

老师:有环的链表如何判断是否相交呢,假设两个链表是有环的,那它可能会有哪几种相交的情况呢。同学们回去思考讨论一下有环链表的交点问题,同学们下课吧。

聪明可爱的你们还有哪些方法呢,联系小编,说出你的想法。

感兴趣的朋友可以关注小编的公众号,更多精彩等着您:javaxiaokashow(JAVA小咖秀)

猜你喜欢

转载自www.cnblogs.com/playburst/p/9097164.html