1.题目描述
2.思路
“双指针切换链表头”
思路一:双指针+路径对齐
while (pA != pB) {
pA = (pA == null) ? headB : pA.next;
pB = (pB == null) ? headA : pB.next;
}
让两个指针走相同的总路径长度!
设:
链表 A 独有部分长度是 lenA
链表 B 独有部分长度是 lenB
公共部分长度是 lenCommon
那两个指针会走的路径:
指针 A:先走 lenA + lenCommon,然后换到 B 头再走 lenB
指针 B:先走 lenB + lenCommon,然后换到 A 头再走 lenA
于是总长度都是:lenA + lenB + lenCommon
3.代码实现
/*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) {* val = x;* next = null;* }* }*/
public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {if(headA==null||headB==null) return null;ListNode PA=headA;ListNode PB=headB;while(PA!=PB){if(PA!=null){PA=PA.next;}else{PA=headB;}if(PB!=null){PB=PB.next;//如果PB列表有元素就直接指向下一个}else{PB=headA;//如果PB已经到末尾了,开始遍历A列表}}return PB;//这边返回PA和PB都可以}
}