判断两个链表是否相交

//不考虑带环的情况
交叉链表图示

//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;
  }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值