2025年- H1-Lc109-160. 相交列表--java版
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都可以
}
}