题目:
输入两个链表,找出它们的第一个公共节点。
如下面的两个链表:
在节点 c1 开始相交。
示例 1:
输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA
= 2, skipB = 3 输出:Reference of the node with value = 8 输入解释:相交节点的值为 8 (注意,如果两个列表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为
[5,0,1,8,4,5]。在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。
分析:
1、两条路径用双指针分别走到底是一长一短的,造成长度有差别的是第一个公共点之前的非公共部分。
2、那就等指针在自己的路径上走到底之后,再去从头走对方的路径,等都走完对方的非公共部分,这时两个指针走过的路程就一样了。
3、两个指针在路径长度上同步之后,下一个不为null的相同节点就是公共节点。
解答:
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
int len1 = 0, len2 = 0;
ListNode* long_p = headA;
ListNode* short_p = headB;
//计算两个链表的长度
while(long_p){
len1++;
long_p = long_p->next;
}
while(short_p){
len2++;
short_p = short_p->next;
}
//两个链表的长度差
int diff;
if(len1 > len2){
diff = len1 - len2;
long_p = headA;
short_p = headB;
}else{
diff = len2 - len1;
long_p = headB;
short_p = headA;
}
//长的先走差值,走完后两个链表再公共节点前长度相同了
while(diff){
long_p = long_p->next;
diff--;
}
//第一个公共节点
while(long_p && short_p){
if(long_p == short_p)
break;
long_p = long_p->next;
short_p = short_p->next;
}
return short_p;
}
};
执行用时:48 ms, 在所有 C++ 提交中击败了85.20%的用户
内存消耗:14.3 MB, 在所有 C++ 提交中击败了16.79%的用户