更详细的讲解和代码调试演示过程,请参看视频
如何进入google,算法面试技能全面提升指南
给定两个单向链表,这两个链表有可能会有重叠,情况如下:
两个单向链表从节点5开始重合,要求给定一个空间复杂度为O(1)的算法,返回两个链表相交时的第一个节点。依据上图,也就是返回节点5.
首先我们需要做的是,确保给定的两个单向链表,他们是相交的。这个很好确定,只要从头遍历两个链表,如果他们的尾节点是一样的话,那么这两个链表就是相交的,问题是,如何尽快找到他们相交的第一个节点。
最笨的办法是,先找到尾节点,然后去掉尾节点,然后再次遍历查找新的尾节点,然后再去掉,直到两个链表没有共同的尾节点,那么最后去掉的共同尾巴节点,则是两个链表的首次相交节点。这种做法可行,但是算法复杂度是O(n^2)。有没有更好的办法呢?
假设第一个链表,从头结点到首次相交节点,所经历的距离用T1来表示,根据上图例子,T1 = 5, 也就是第一个队列从头结点0开始,需要经历节点1,2,3,4也就是总共5个节点后才能到达节点5.
我们用T3 表示队列2从头节点开始,到达首次相交节点的距离。根据上图,T3 = 3.
我们用