#include<iostream.h>
#include<stdlib.h>
typedef struct LNode
{
 int data;
 struct LNode *next;
}LNode,*LinkList;
void main()
{
 int n,m,count1=0,count2=0;
 cout<<"单链表的长度:"<<endl;
 cin>>n;
 cout<<"循环链表的长度:"<<endl;
 cin>>m;
 LinkList head=(LinkList)malloc(sizeof(LNode)); 
 LinkList p,q,s,t,curr,head2;
 head->data=1;
 head->next=NULL;
 p=head;
 curr=p->next;
 for(int i=2;i<=n+1;i++)
 {
 s=(LinkList)malloc(sizeof(LNode));
 s->data=i;
 s->next=curr;
 p->next=s;
 p=s;
 curr=p->next;
 }
 head2=s;
 p=head2;
 for( i=n+2;i<=m;i++)
 {
 s=(LinkList)malloc(sizeof(LNode));
 s->data=i;
 s->next=p->next;
 p->next=s;
 p=s;
 }
 p->next=head2;
 //cout<<p->next->data<<endl;
 p=head2;
 s=p;
 t=head;
 while(t!=p)
 {
  cout<<t->data<<"  ";
  t=t->next;
  count1++;//记录走一步的次数
 }
 
 do
 {
  cout<<p->data<<"  ";
  p=p->next;
 }while(p!=s);
//判断有环否
 p=head;
 q=head;
 do{
  p=p->next;
  q=q->next->next;
 }while(p!=q&&q);
 if(q==p) cout<<endl<<"exist loop"<<endl;
 cout<<"两个指针环内的交点是:"<<p->data<<endl;
//查找第一个交点
 t=q; 
 p=head;
 do
 {
  s=t;
  do
  { s=s->next;
   count2++;
  }while(s!=q);
  if(count2==count1) //防止单链表和循环链表的个数相等。
   //count1到交点之前走一步的次数 ,count2从交点之后到次数
  {
   cout<<"交点是"<<s->data<<endl;
   break;
  }
  else
   s=t;
  do{
   s=s->next;
  }while(p!=s&&s!=t);
  if(p==s)
  {
   cout<<"交点是"<<s->data<<endl;
   break;
  }
  p=p->next;
 }while(p!=t);

}