两条无环链表相交
先说结论
- 两条无环链表相交,只能为Y形状,不可能为X形状。
- 两条无环链表相交,尾结点必定相同。
- 判断两条无环链表是否相交,看是不是同一个尾结点,是则相交。
- 两条无环链表相交,求相交的第一个结点,算法思想:长度相减。
解释
- 链表的每一个结点只有一个后继结点,如果是X这种形状,那么相交处的结点同时有两个后继结点,不符合链表的要求。但是Y这种形状,在相交处的结点只有一个后继结点,是符合要求的。另外对于前驱结点,是可以有多个的,链表只要求从头能走到尾,所有后继结点必须是唯一的,没有直接求前驱的链表(这里说的是普通的链表,双向链表是可以直接求前驱的),所以前驱有两个也不影响。
- 在明白上面说的第一点后,不难理解,两条无环链表相交,只能Y形状,所以说它们的尾结点必定相同。
- 第二点两条无环链表相交,尾结点必定相同,所以我们可以用这个知识点,反过来去判断两条无环链表是否相交,只需遍历链表,看两者尾结点是否相同,相同则是相交,反之,则不相交。
- 我们可以较为容易的遍历链表得到它的长度,我们遍历两条链表,用得到的长度len1-len2(len1为长的那条的链表长度),得到差值,让长的链表先遍历这个差值长度,然后两条链表一起开始遍历,只第一个相同的结点,就是相交的第一个结点。
有环情况
问题
- 判断链表是否有环,快慢指针。
- 求入环的第一个结点。
- 有环链表和无环链表不相交。
解释
- 判断一条链表是否有环,可以用到快慢指针,其实很好理解,我们假设一个指针a,一个指针b,ab同时从头开始遍历,a每次进1,b每次进2,如果没有环,b肯定比a先遍历完,也就是说它们不会出现相等的情况,只有出现有环的情况,才会出现ab某一个时刻相等。
- 求入环的第一个结点,我们从环处断开,那么是不是就变成了上面的两个无环链表相交,求第一个相交结点的问题。