题目 :输入两个链表,找出它们的第一个公共节点。
算法思路 :
- 首先我们要明确,两个链表相交,是Y形状的
- 两个链表相交,是next域相同
- 因为两个单链表的长度是不一样的,所以我们需要让长的那个链表,引用走两个链表的差值步
- 然后再同时走一步,直到相遇
- pl: 永远指向最长的链表
- ps:永远指向最短的链表
代码实现 :
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode pl=headA; //先假设A链表是最长的
ListNode ps=headB; // B链表是最短的
int len=0;
int lenA=0;
int lenB=0;
while (pl!=null){ //计算A链表的长度
lenA++;
pl=pl.next;
}
pl=headA; //重新指回去
while (ps!=null){ //计算B链表的长度
lenB++;
ps=ps.next;
}
ps=headB;//重新指回去
len=lenA-lenB;
if (len<0){
pl=headB;
ps=headA;
len=lenB-lenA; //假设错误的话交换过来
}
for (int i = 0; i < len; i++) { //让长的链表先走差值len步
pl=pl.next;
}
while (pl!=ps && pl!=null && ps!=null){ //两个引用相遇了即找到了相交点
pl=pl.next;
ps=ps.next;
}
return pl; //返回相交点
}