思路:双指针。如果链表相交的话,那肯定最后一段是重合的,所以可以直接按两段链表中长度较短的一个开始遍历。所以先求出A链表和B链表的长度,这里设置curA指针永远指向链表较长的一个链表,如果链表A长度小于B的,那么就交换lenA和lenB,使操作的都是A(较长的一段链表,可能是A也可能是B),求出链表A和B长度的差值,让curA向前移动这个差值的步数,这样两段链表长度得到统一,就开始比较值是否相同,相同就返回当前两指针的一个,不同两个指针就向后移。
题解c++:
/**
* 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) {
int lenA=0;
int lenB=0;
ListNode *curA=headA;
ListNode *curB=headB;
while(curA!=NULL)
{
lenA++;
curA=curA->next;
}
while(curB!=NULL)
{
lenB++;
curB=curB->next;
}
curA=headA;
curB=headB;
if(lenA<lenB)
{
swap(lenA,lenB);
swap(curA,curB);
}
int gap=lenA-lenB;
while(gap--)
{
curA=curA->next;
}
while(curA!=NULL)
{
if(curA==curB)
return curA;
else
{
curA=curA->next;
curB=curB->next;
}
}
return NULL;
}
};