来说说链表相交问题。
假设有链表L1和L2,长度分别为N1,N2
1.相交判断
(1)遍历L1,对每一个节点的地址,建立哈希set,然后遍历L2,判断L2节点在不在哈希set中。
时间复杂度:o(N1 + N2/2)
空间复杂度:o(N1)
优点:可以顺便定位交点。
缺点:需要空间复杂度。
(2)都找到最后一个节点,然后判断最后一个节点是否一样即可。
如果维护一个尾节点的变量的话,这个查找复杂度,就是常量。不然需要遍历两个链表。
优点:无需空间,如果维护尾节点,效率极高。不维护,也比较快。
缺点:无法定位相交点。
(3)L1尾节点连到L1的首节点,然后判断L2是否有环。判断方法为,设置两个指针,一个移动慢,一个移动快。快的每移动一步,都和慢的指针,比较。
注意:还有一种判断有环的方法,就是将链表地址放入一个map,使用[]放入元素,然后判断返回值,看是否为false,如果是false就有环。
这样还能找到环是从哪里开始的。
2.交点定位
(1)1中的(1)
(2)比较两个链表长度,然后让长的先移动差值,然后两个一起移动,每次移动比较。
(2)比(1)的优点是,无需空间复杂度。
3.有环链表
判断相交,可以采用,追嘛,肯定两个都会进入环,然后一快一慢就能追上。