cpp
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if (headA == null || headB == null) {
return null;
}
ListNode pA = headA, pB = headB;
while (pA != pB) {
pA = pA == null ? headB : pA.next;
pB = pB == null ? headA : pB.next;
}
return pA;
}
}
可以,这题最关键的就是这两句三目运算符:
pA = pA == null ? headB : pA.next;
pB = pB == null ? headA : pB.next;
三目运算符格式是:
条件 ? 条件成立时的值 : 条件不成立时的值
所以:
pA = pA == null ? headB : pA.next;
等价于:
if (pA == null) {
pA = headB;
} else {
pA = pA.next;
}
意思就是:
pA如果走到 A 链表末尾了,就去 B 链表开头;否则继续往后走。
同理:
pB = pB == null ? headA : pB.next;
等价于:
if (pB == null) {
pB = headA;
} else {
pB = pB.next;
}
也就是:
pB走完 B 后,就去 A 的开头。
这题的核心思路可以直接记成:
pA:A → B
pB:B → A
假设:
A:1 → 2 → 3 → 8 → 9
B: 4 → 5 → 8 → 9
两个链表前面长度不一样,所以直接一起走不一定同时到 8。
但是交换路线以后:
pA走:A的长度 + B的长度
pB走:B的长度 + A的长度
两个人最终走的总长度一样,所以长度差被抵消。
最后要么:
在相交节点相遇
要么两个链表不相交,最终:
pA == null
pB == null
也会满足:
pA == pB
循环结束。
所以一句话记忆:
A走完去B,B走完去A,交换路线抵消长度差,最终在交点相遇。
三目运算符再单独记:
pA == null ? headB : pA.next
就是:
pA为空?
是 → 跳到B头部
否 → 继续走下一个节点