输入两个链表,找出它们的第一个公共结点
方法一:遍历
public static Node getPublicNode(Node headA, Node headB){
//寻找两个链表的公共结点
int headASize=0;
int headBSize=0;
Node curA=headA;
while(curA!=null){//统计链表A的结点数
headASize++;
curA=curA.next;
}
Node curB=headB;
while(curB!=null){//统计链表B的结点数
headBSize++;
curB=curB.next;
}
curA=headA;
curB=headB;
//让两个链表对齐再遍历
if(headASize>headBSize){
int k=headASize-headBSize;
while(k>0){
curA=curA.next;
k--;
}
}
if(headASize<headBSize){
int k=headBSize-headASize;
while(k>0){
curB=curB.next;
k--;
}
}
while(curA!=null&&curB!=null){
if(curA.next==curB.next)
return curA.next;
curA=curA.next;
curB=curB.next;
}
return null;
}
方法二:递归(比较nb)
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if (headA == null || headB == null) return null;
ListNode pA = headA, pB = headB;
while (pA != pB) {
pA = pA == null ? headB : pA.next;
pB = pB == null ? headA : pB.next;
}
return pA;
}