@labuladong
方法一:两个指针,一个先遍历 A ,再遍历 B ,如果有相交部分,再相交位置会相等
方法二:将 A、B中长的部分从前面截掉,再进行遍历,则同时到达相交点
方法三:将 A 的末尾与 B 的开头连接起来,则简化为“是否有环及环起点”的问题
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
//一个指针先遍历B再遍历A,一个指针先遍历A再遍历B,两者是同时结束的,即同时为null
ListNode p1 = headA , p2 = headB;
while (p1 != p2) {
// p1 走一步,如果走到 A 链表末尾,转到 B 链表
if (p1 == null) p1 = headB;
else p1 = p1.next;
// p2 走一步,如果走到 B 链表末尾,转到 A 链表
if (p2 == null) p2 = headA;
else p2 = p2.next;
}
return p1;
}
}