题目:
有两个链表,从链表中的某个节点开始往后的其他节点都是重复的,形成一个如下Y字型的结构:
通过观察我们可以看到:从7开始往后的所有节点都是两个链表中的公共节点,因此7就是我们想要找的第一个公共节点。接下来我给出一些解题思路:
思路一:
对第一个链表中得任何一个节点,我都去从头开始扫描一遍第二个链表中的每一个节点看是不是公共节点,如果是就返回;如果不是继续链表一中的下一个节点。
这个过程对head1中的每一个节点,都要扫描一下head2,时间复杂度为O(m*n);其中m、n分别为两个链表的长度。
思路二:
借助于两个栈,将从头开始将head1链表中的每个节点入栈;从头开始将head2链表中国的每一个节点入栈;这样处理后,两个链表的公共节点都放在栈的上面,接下来如果两个栈栈顶元素相同的话分别对两个栈出栈,最后一个相同的元素就是我们要找的第一个公共节点。
出栈一个栈顶元素后:
出栈栈顶元素8后:
出栈栈顶元素7后:
此时两个栈顶元素都不相同,那么可知7是两个链表的第一个公共节点。
时间复杂度为O(m+n),需要借助于额外的两个栈。
思路三:(效率最高)
首先,从头到尾扫描一下两个链表,计算较长的比短的多出来k个节点;
然后,先从较长的链表出发走k步,然后在两个链表同时向前走,可以获得两个链表的第一个公共节点;
过程:
首先分别扫描两个链表,可知head1长为7,head2长为5,显然head1比head2多出来两个节点。那么head1先移动到第三个节点:
然后两个指针同时先后移动,找到第一个公共节点就停止:
时间复杂度为:O(m+n),不需要额外的辅助空间。
效率最高