基本思路
总体的流程实际上就是先统计两条链表的长度,然后长的链表先走二者长度的差值的步数,这样子,我们两条链表进行一步一步走,并实时判断对应的指针是否相同(不是数值相同),相同就代表是相同的节点。
leetcode 02.07 链表相交
/**
* 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 lenA = 0, lenB = 0, len = 0;
//计算lenA的长度
while(curA)
{
lenA += 1;
curA = curA->next;
}
//计算lenB的长度
while(curB)
{
lenB +=1;
curB = curB->next;
}
//重新回到原本的位置
curA = headA;
curB = headB;
//计算差值
//这里我们会发现lenA和lenB的大小,需要进行分类,所以防止分类,我们可以直接通过swap进行改变。
if(lenB > lenA)
{
//这里值得关注的是,swap交换底层交换是交换两个的数值,但是此处数值的理解是将地址的交换,好好理解一下这段话。
swap(lenA , lenB);
swap(curA , curB);
}
//此处之后就是lenA一定大于lenB了
len = lenA - lenB;
//让长度大的链表先走n步
while(len--)
{
curA = curA->next;
}
//此时就可以开始一起走,直到两个都相同的时候就可以返回了
while(curA && curB)
{
if(curA == curB)
{
return curA;
}
curA = curA->next;
curB = curB->next;
}
return NULL;
}
};