image.png

解题思路

双指针

设 A 的长度为 a + c,B 的长度为 b + c,其中 c 为尾部公共部分长度,可知 a + c + b = b + c + a。
当访问链表 A 的指针访问到链表尾部时,令它从链表 B 的头部重新开始访问链表 B;同样地,当访问链表 B 的指针访问到链表尾部时,令它从链表 A 的头部重新开始访问链表 A。这样就能控制访问 A 和 B 两个链表的指针能同时访问到交点。

  1. public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
  2. ListNode l1 = headA;
  3. ListNode l2 = headB;
  4. while(l1!=l2){
  5. if(l1==null)
  6. l1=headB;
  7. else
  8. l1=l1.next;
  9. if(l2==null)
  10. l2=headA;
  11. else
  12. l2=l2.next;
  13. }
  14. return l2;
  15. }