【问题1】如何判断两个单链表相交
由于是单链表,必然是Y型,而不可能是X型,因此最后一个节点肯定是共同节点
【问题2】第一个交点在哪?
实际上这是一个老题目变换来的。
【问题2.1】.如何判断单链表里面是否有环?
算法的思想是设定两个指针p,q,其中p每次向前移动一步,q每次向前移动两步。那么如果单链表存在环,则p和q相遇;否则q将首先遇到null。这里主要理解一个问题,就是为什么当单链表存在环时,p和q一定会相遇呢?会不会跳过。
实际上这是不会被跳过的,并且p最多也才是绕环一周。
【1】 肯定会追上;并且是p绕环一周内,因为如果p绕一周,q已经两圈了;
【2】 追上的时候肯定会碰到,原因是p在追q的最后阶段只有两种可能,两者相隔1个或2个节点。【a】当相隔1个节点时,q的下一个落脚点是p的前面一个位置,此时q的下一步正好踩上;【b】当相隔两个节点是,q直接踩上;
【问题2.2】如何判断单链表的环的长度?
这个比较简单,知道q 已经进入到环里【比如问题2.1中追上的那个节点,就肯定在环上】,保存该位置。然后由该位置遍历,当再次碰到该q 位置即可,所迭代的次数就是环的长度。
【问题2.3】如何找到链表中第一个在环里的节点?
假设链表环上第一个节点是距离头的第n个节点,那么当p到达此处时,q在第2n的位置,并且距离p为n,我们由问题2.2可得到环的长度L,那么环的入口就是q继续走L-n步的位置
【问题2.4】两个单链表相交,第一个交点在哪里?
这个问题实际是问题2.3的变形,因为将链表的尾部链接到其中一个链表的头,就构成了上面的结构