public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
//头节点相等
if(headA==headB){
return headA;
}
ListNode cur1=headA;
int len1=0;
ListNode cur2=headB;
int len2=0;
//计算两个链表的长度
while(cur1!=null){
len1++;
cur1=cur1.next;
}
while(cur2!=null){
len2++;
cur2=cur2.next;
}
//判断完把两个指针归零
cur1=headA;
cur2=headB;
//判断谁的长度大,让谁先走差值步
int index=0;
if(len1>len2){
index=len1-len2;
while(index!=0){
cur1=cur1.next;
index--;
}
while(cur1!=null){
if(cur1==cur2){
return cur1;
}
cur1=cur1.next;//先判断if语句,再执行指针移动,不然可能会错过第一个节点
cur2=cur2.next;
}
}
else if(len1<len2){
index=len2-len1;
while(index!=0){
cur2=cur2.next;
index--;
}
while(cur2!=null){
if(cur1==cur2){
return cur2;
}
cur1=cur1.next;
cur2=cur2.next;
}
}
else{//(len1==len2)
while(cur1!=null){
cur1=cur1.next;
cur2=cur2.next;
if(cur1==cur2){
return cur1;
}
}
}
return null;
}
}
解题思路
这道题的目的是让找出两条相交链表的交点,返回这个节点.
1)首先我们来思考,相交时的节点有什么特征?
即两个链表的节点相等,注意这里不是交点的值相等,不然如果出现相同值的话,就会报错.
if(curA==curB){
return A;
}
2)如何找到这个交点的位置?
1.如果两条链表一模一样,那交点就是头节点.
2.如果头节点不一样,说明交点不是头节点.那就可以根据长度来判断,因为两条链表相交后的链表是一模一样的,所以相交后的长度也会一样.
3.当两条链表长度相等时,直接遍历链表,同时移动双指针,当两条链表的节点相等时,就是我们要的节点.
4.当两条链表长度不相等时,因为相交后的长度一样,所以是相交前的长度不一样,我们可以算出哪一条链表长,让长的链表提前走完长度差的步数,这样,我们就又可以遍历链表,然后同时移动双指针了.