解题思路
定义双指针,分别指向A和B的头部。
如果链表一样长且有交点,则第一次遍历就能找到相同交点,返回
如果不一样长且有交点,则指针遍历一条链表后,遍历另一条链表
如:A链表的指针遍历完A了,下一步继续遍历B链表。B链表的指针遍历完B了,下一步继续遍历A链表。
如图所示,由于a+c+b=b+c+a,所以两个指针在第二次遍历的时候,一定会在相交节点处相遇。
如果没有交点,则第二次遍历结束都是null,遍历结束,返回null
a+b=b+a,最终一定都会指向null。
其实这种情况也可以这么理解:A和B的相交节点为null,遍历两次,一定能找到相交节点。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode* a = headA;
ListNode* b = headB;
while (a != b)
{
a = a != nullptr ? a->next : headB;
b = b != nullptr ? b->next : headA;
}
return a;
}
};