题目描述
在本题中,单链表可能有环,也可能无环。给定两个单链表的头节点head1和head2,这两个链表可能相交,也可能不相交。请实现一个函数,如果两个链表相交,请返回相交的第一个节点;如果不相交,返回null即可。 要求:如果链表1的长度为N,链表2的长度为M,时间复杂度请达到O(N+M),额外空间复杂度请达到O(1)。
考察点
- 判断链表是否有环
- 如果链表有环,则找到入环结点
- 两个链表各种情况的分析
情况分析
这道题总共有6种情况要分析。分别是
- 两个链表无环
- 两个链表有环
- 一个链表有环,一个链表无环
1、如果两个链表都无环,那就直接判断是否相交即可。
2、如果两个链表都有环,求出入口节点。
求出入口节点,如果入口节点是同一个的话,把相同的入口结点当作是尾结点,这个问题就退化成两个链表都无环,直接判断是否相交即可。
如果入口节点不是同一个的话,从第一个入口节点开始next下去,如果遇到第二个入口节点返回即可;如果回到了本身的入口节点则表示没有相交,直接返回null
3、如果一个链表有环,一个链表无环,那么这两个链表必不可能相交
所有的情况就都已经分析完了,接下来就是上代码了
代码
1 | package zuoshen; |
总结
这道题其实是挺难的,但是听了左神老师讲完之后发现也就那样。由此可见,一道难的题目都是由一些简单的题目组合起来的。这道题就是两个无环链表判断相交并且返回相交节点,有环链表求它的入环节点,这两道题目的组合就是今天这道题的由来,所以情况更加的复杂。