题目:输入两个链表,找出它们的第一个公共结点。
链表形状:
![0f24fd73b7178b4c2bbe9444764c3f47.png](https://img-blog.csdnimg.cn/img_convert/0f24fd73b7178b4c2bbe9444764c3f47.png)
思路:这道题是链表的基础题,和链表的反转一样,应该熟练。
下面总结下这道题的4种解法:
观察上图可知,要找到公共节点6,正向遍历链表会存在链表不一样长问题,最暴力方法就是两个For循环,复杂度o(mn),显然不是面试官想看到的,也不是最优的。所以有了其他3种时间复杂度为o(m+n)的方法。
方法一:
将链表节点放入两个堆中,然后从顶部粗话元素,第一个相等的元素就是公共节点。
方法二:
先计算两个链表的长度分别为m,n(m>n),让长的链表指针先走(m-n)个节点,然后两个指针同时运动,第一个相等的节点就是公共节点。
方法三:
直接反转两个链表,然后两个指针同时开始运动,第一个不相等的节点就是正向的公共节点,记住位置(k),然后正向访问倒数第k个节点就是公共节点。
demo:基于第二种方法编写,在线可以调通。
#include