两个非空单向链表是否有交叉点,若有交点,返回公共交点的地址,若没有交点,返回NULL
注:如果两个链表有交点,最后一个结点肯定相同
- 方法一(使用栈)
将两个链表中的元素入两个栈中,如果有交点,则最初出栈时结点值相等,依次出栈,直到值不相等时,值不相等的结点的上一个结点是公共交点
ElemSN * Stack(ElemSN*h1,ElemSN*h2) // h1,h2两个链表的头结点
{
ElemSN**s1; //定义指向栈空间的指针
ElemSN**s2;
ElemSN*p;
int top1=-1,top2=-1;
s1=(ElemSN**)malloc(100*sizeof(ElemSN**));
s2=(ElemSN**)malloc(100*sizeof(ElemSN**));
for(p=h1; s1[++top1]=p ;p=p->next); //链表元素入栈 ,赋值表达式作条件
for(p=h2; s2[++top2]=p ;p=p->next); //链表元素入栈 ,赋值表达式作条件
while(top1!=-1&&top2!=-1&&s1[top1]==s2[top2])
{
top1--;
top2--;
}
if(top1==-1||top2==-1) return 0;
else {
return s1[top1+1]; //返回第一个相交的结点地址
}
}
- 方法二
ElemSN *Node(ElemSN *h1,ElemSN *h2)
{
ElemSN *p1,*p2;
int cnt=0;
for(p1=h1; p1 ;cnt++,p1=p1->next); //遍历两个链表,统计每个链表结点个数
for(p2=h2; p2 ;cnt--,p2=p2->next);
if(cnt>0){ //永远让p1指向长的链表
p1=h1;
p2=h2;
}
else{
p1=h2;
p2=h1;
cnt=-cnt;
}
for( ; cnt ; p1=p1->next,cnt--); //p1先遍历cnt个结点,则其剩下的结点个数与p2一样多
for( ; p1-p2; p1=p1->next,p2=p2->next); //两个链表同时开始遍历,直到p1=p2;
if(p1==p2) return p1;
else return 0;
}