思路:
采用双指针方法。让两个链表尾对齐,开始两个指针指向的位置是较短链表首结点,然后依次向后搜索,若遇到指向的结点相同,则返回。
/**
* 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* curA = headA;
ListNode* curB = headB;
int len_A = 0, len_B = 0;
while(curA)//获得A的长度
{
curA = curA->next;
++len_A;
}
while(curB)//获得B的长度
{
curB = curB->next;
++len_B;
}
curA = headA;
curB = headB;
if(len_A > len_B)
{
int num = len_A - len_B;//获得A和B的差值
while(num--)
{
curA = curA->next;//A的起始结点为 当A和B尾对齐后,B的头结点所在位置
}
}
else//若B大于等于A
{
int num = len_B - len_A;//获得A和B的差值
while(num--)
{
curB = curB->next;//B的起始结点为 当A和B尾对齐后,A的头结点所在位置
}
}
while(curA)//从当前起点出发,若相同则返回
{
if(curB == curA)
{
return curA;
}
curA = curA->next;
curB = curB->next;
}
return NULL;
}
};