这道题用了一种比较妙的方法,即定义两个指针分别遍历两个链表,当某一个指针遍历完自己的链表后,就开始遍历另一个链表。当pA == pB的时候,就跳出循环,这里有两种情况:
1、存在交点的情况。在遍历的过程中,两个指针同时指向交点了,这时,返回pA或者pB都行;
2、不存在交点的情况。两个指针遍历完两个链表之后,同时指向空了,这时,同样是返回pA或者pB都行。
代码就是下面的样子。
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode* pA = headA;
ListNode* pB = headB;
while (pA != pB) {
if (pA != nullptr) pA = pA->next;
else pA = headB;
if (pB != nullptr) pB = pB->next;
else pB = headA;
}
return pA;
}
};
也可以写成三目运算符的形式,简化代码量
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode* pA = headA;
ListNode* pB = headB;
while (pA != pB) {
pA = pA ? pA->next : headB;
pB = pB ? pB->next : headA;
}
return pA;
}
};