面试题 02.07. 链表相交
思路
方法1
如果有交点,当A长度不等于B长度时
如a=5,b=6,图中的b1永远不可能为交点
交点只可能出现在长度短的一方节点中
- 求出A和B的长度(a=5,b=6)
- 求差值(6-5=1)
- ptrA指向headA,ptrB指向headB
- 长的链表前进差值数(ptrB+=1)
- ptrA和ptrB一起+1,地址相同表示相交,都指向空表示未相交
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode* A=headA;
ListNode* B=headB;
int a=0,b=0;
while(A!=NULL)
{A=A->next;
a++;
}
while(B!=NULL)
{B=B->next;
b++;
}
A=headA;
B=headB;
if(a>=b)
{
int c=a-b;
while(c--)
A=A->next;
}
else
{
int c=b-a;
while(c--)
B=B->next;
}
while(A!=NULL)
{
if(A==B)
return A;
A=A->next;
B=B->next;
}
return NULL;
}
};
方法二
A链表由a+c组成(a=2,c=3)
B链表由b+c组成(b=3,c=3)
最后为指向空
蓝色为交叉点,绿色为除交叉点的其他相同点
当我们将
A后面接上B: a+c+b+c=(a+c+b)+c
B后面接上A: b+c+a+c=(b+c+a)+c
看图中排列,最后两条链表的交点处同一序号中,就可以判断
当 两个指针相同且不为空时,为交点处
当 两个指针指向空,无交点
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
if(headA==NULL||headB==NULL)
return NULL;
ListNode* A=headA;
ListNode* B=headB;
while(A!=B)
{
A=A==NULL?headB:A=A->next;
B=B==NULL?headA:B=B->next;
}
return A;
}
};