首先两个链表相交是Y型相交,而不是X型相交,因为一个节点只有一个next,所以两个链表相交后的节点也都一样
;其次判断两个链表的相交并不是比较值相交,而是比较比较两个链表的引用,也就是比较内存地址是否相同;
思路:
一. 首先求出两个链表的长度分别为size1和size2
二.求出两个链表的差值offset,让长的链表先走offset步,这样两个链表的长度就一样了.
三.然后比较两个链表节点的对象是否相同,也就是比较引用地址是否相同,如果相同就说明相交,不同就让两个链表往后走,知道走完还没相交,那么就返回null;
public class GetNode {
static class ListNode {
//静态类方便调用
int val;
ListNode next;
public ListNode(int val) {
this.val = val;
}
//求链表长度方法
public int size(ListNode A){
ListNode cur=A;
int size=0;
while(cur!=null){
cur=cur.next;
size++;
}
return size;
}
public ListNode getInterSectionNode(ListNode headA,ListNode headB){
int size1=size(headA);
int size2=size(headB);
while(headA!=null&&headB!=null){
if(size1>size2){
int offset=size1-size2;
for(int i=0;i<offset;i++){
headA=headA.next;
}
}else{
int offset=size2-size1;
for(int i=0;i<offset;i++){
headB=headB.next;
}
}
//此时两个链表起点一样了
}
while(headA!=null&&headB!=null) {
//比较节点是不是相同对象
if(headA==headB){
return headA;
}
headA=headA.next;
headB=headB.next;
}
return null;
}
}
}