相交链表
思路:我们计算A和B链表的长度,求出他们的差值(len),让链表长的先多走len步,最后在A,B链表一起向后走,即可相逢于相交节点
实现代码如下:
public class Solution {
public int size(ListNode phead){
if(phead==null){
return 0;
}
ListNode cur=phead;
int count=0;
while(cur!=null){
count++;
cur=cur.next;
}
return count;
}
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode pl=headA;//long
ListNode ps=headB;//short
int lenA=size(pl);
int lenB=size(ps);
if(headA==null||headB==null){//如果其中一个链表为空,则不存在相交节点,直接返回null
return null;
}
if(lenA>lenB){
//如果A链表长度 > B链表,让pl引用指向A链表
//ps引用指向B链表
pl=headA;
ps=headB;
}else {
//如果A链表长度 < B链表,让ps引用指向A链表
//pl引用指向B链表
ps=headA;
pl=headB;
}
//计算两链表的长度差
int len=0;
if(lenA>lenB){
len=lenA-lenB;
}else {
len=lenB-lenA;
}
//让长链表先多走len步
while (len!=0){
pl=pl.next;
len--;
}
while(pl!=null){
//若节点的next域指向相同,则说明找到了相交节点
if(pl==ps){
return ps;
}
pl=pl.next;
ps=ps.next;
}
//链表走到底,为空了,还没有找到,就说明不存在相交节点,返回null
return null;
}
}