剑指 Offer 52. 两个链表的第一个公共节点
😘😘😘😘😘😘😘😘😘😘
刷题使我开心
🌜题目:输入两个链表,找出它们的第一个公共节点。
如下面的两个链表**:**
在节点 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 个节点
思路
前提了解同一个节点是指他们的节点地址相同,不是元素。
使用双指针解决,一个
指针
着在A链表,一个指针
在B链表,两个指针分别跑,计算出各自的长度,长的减去断的,得到差值(gad)
,让长指针先多走gab步,(因为0到gad 之前的节点肯定不相同,因为我们比较不是元素),最后两个指针再一起走
,一起比较
public class 两个链表的第一个公共节点 {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode left=headA;
ListNode right=headB;
int lenA=0;
int lenB=0;
while (left!=null){
lenA++;
left=left.next;
}
while (right!=null){
right=right.next;
lenB++;
}
left=headA;
right=headB;
int gad=0;
ListNode temp=null;
if (lenB>lenA){
temp=left;
left=right;
right=temp;
gad=lenB-lenA;
}else {
gad=lenA-lenB;
}
while (gad>0){
left=left.next;
gad--;
}
while (left!=null){
if (left==right){
return left;
}
left=left.next;
right=right.next;
}
return null;
}
}