//不考虑带环的情况
//1.0将他们长度统一,判断是否有公共结点
ElemSN *TheSameNode(ElemSN *head1,ElemSN *head2)
{
int cnt=0;//累加器,计算相差多少个结点
ElemSN *p=head1,*q=head2,*t;//无论第一个链表长还是第二个链表,都当作第一个长
for(t=head1;t;cnt++,t=t->next);
for(t=head2;t;cnt--,t=t->next);
if(cnt<0){//第二个长
cnt=-cnt;
t=p;
p=q;
q=t;
}
for(int i=0;i<cnt;p=p->next,i++);//在长链上移动指针p,统一长度
for(;p&&q&&p-q;p=p->next,q=q->next);//判断是否有交点
return p;//没找到返回NULL,找到返回第一个公共结点的地址
}
//设置岗哨,跑到岗哨前面停,然后岗哨后移
//无论有无交点都相当于有交点,无相当于交于NULL,有则返回
ElemSN *TheSameNode(ElemSN *head1,ElemSN *head2)
{
ElmSN *p,*q,end1=end2=NULL;
while(end1==end2){//end1和end2相等,说明有公共交点,此时公共交点可能是NULL
for(p=head1;p->next-end1;p=p->next);//将p置于end1前面,相当于链表在往回跑
for(q=head2;q->next-end2;q=q->next);
end1=p;//岗哨后移
end2=q;
}
return end1->next;
}