两年前写的一个小漫文,除了可以学习知识,还可以收集表情包?。
linglingling,why 星球计算机二班开始上课了。
老师:同学们好,上节课讲了如何判断环形单链表的问题,那么如何判断两个单链表是否有交点呢?首先,链表分有环和无环两种,我先来分析一种简单情况,假设两个链表是无环的。我们来看一下两个无环的单链表有哪些相交情况。(注明:每个节点均有数据和指针)
情况一:(平行)
情况二:(相交)
好,那么谁来说一下。
同学们纷纷举了手,小白你来说一下。
小白:
两层循环,外层循环循环第一个链表的每一个节点,内层循环循环第二个链表的每一个节点,然后和外层循环的当前节点进行比较,如果有相等的则说明两个链表有交点。
老师:很好,这样做可以判断时候有交点问题。但是效率并不高,遍历两次时间复杂度 o(n^2), 由于没有开辟额外的空间,所以空间复杂度 o(1)。哪位同学有更好的方法。
同学们纷纷举了手,小红你来说说。
小红:
循环第一个链表把第一个链表的每个节点放到 hashset 里,循环第二个链表,看当前节点是否存在第一个链表保存的 hashset 中,如果存在,则存在交点。
老师:很好,虽然时间复杂度虽然降低为 o(n^1),但是由于开辟了和链表单独相关的 n 的空间,所以空间复杂度 o(n)。那有没有时间复杂度是 o(n^1), 空间复杂度 o(1) 的呢。谁来说一下。
此时举手的少了一些。好,课带表来。
课带表:
最后一个交点相等。声明两个尾节点,同时循环两个链表,如果没有下一个节点,赋值给当前的尾节点。比较这两个尾节点,如果相同则说明有交点。
老师:很好,我们上节课学习判断链表是否有环的方法,能不能利用这个方法进行判断呢?
学委:
让链表一的尾指针指向链表二的头指针,如果存在环,则说明有交点。
老师:大家要集思广益啊,问题解法不止有一种哦,谁还有其他的想法都可以说说哈。
小白:
先求出两个链表分别的长度,长度相减,让长的先走 s1 – s2, 然后两个链表继续向前走,如果遇到相同的节点则说明两个链表有交点。
老师: 有环的链表如何判断是否相交呢,假设两个链表是有环的,那它可能会有哪几种相交的情况呢。同学们回去思考讨论一下有环链表的交点问题, 同学们下课吧。
文章持续更新中,⛽️。另外 博主整理 + 原创 15 万字面试题,包括 17 个专题。欢迎大家关注“Java 小咖秀”回复“面试”即可获得 Java 小咖秀面试笔记.pdf