【题目】给定两个有可能又环也有可能没有环的单链表,头节点head1和head2.请实现一个函数,如果两个链表相交,请返回相交的第一个节点。如果不相交,返回null.
【要求】如果两个链表长度之和为N,时间复杂度请达到O(N),额外空间复杂度请达到O(1)。
先解决一个有意思的事情。一个单链表如何判断它有没有环?
两种思路:
①第一种思路
借助另一种数据结构 Set 通过遍历链表的每个值,不存在Set的值就放入,当检测到Set中存在该值时,表示该链表有环。
②第二种思路 不借助外部数据结构
使用快慢指针进行遍历。假设慢指针每次走一个节点,快指针每次走两个节点,那么有下面一个重要结论: 快指针第一次追上慢指针(相遇),表示该链表有环。当第一次快指针追上慢指针后,将快指针置回到头节点,快慢指针第二次相遇时,该节点为该环的起始相交节点。