日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

判斷兩個(gè)鏈表是否相交

 豬小猴 2014-10-07

題目:給出兩個(gè)單向鏈表的頭指針,比如h1、h2,
判斷鏈表是否相交,如果不相交返回NULL;如果相交,返回指向第一個(gè)相交節(jié)點(diǎn)的指針;
時(shí)間復(fù)雜度控制在O(n)的前提下。
http://blog.163.com/song_0803/blog/static/4609759720120910373784/


  總結(jié):
判斷鏈表存在環(huán)的的情況:int* testCylic(Node *h)
1.若都不存在環(huán),int* isJoinedSimple(Node *h1,Node *h2)
  有交點(diǎn)為“Y”形,最后一個(gè)結(jié)點(diǎn)相同,abs=a-b,返回第一個(gè)相交節(jié)點(diǎn)的指針
2.若存在環(huán)
1).當(dāng)一個(gè)鏈表中有環(huán),一個(gè)鏈表中沒有環(huán)時(shí),兩個(gè)鏈表必不相交
2).當(dāng)兩個(gè)鏈表中有環(huán),找出兩個(gè)鏈表入環(huán)的第一個(gè)結(jié)點(diǎn)記為p1,p2
  a.如果p1==p2,說明兩個(gè)鏈表在入環(huán)之前或入環(huán)的第一個(gè)結(jié)點(diǎn)相交;
    則此時(shí)可以轉(zhuǎn)為兩個(gè)鏈表均不帶環(huán)相交的判斷,把p1,p2當(dāng)作最后的末尾結(jié)點(diǎn)。
 或者從尾節(jié)點(diǎn)開始尋找第一個(gè)相交的節(jié)點(diǎn)。
  b.如果p1!=p2,此時(shí)兩個(gè)鏈表可能完全不相交;也可能兩個(gè)鏈表完全共有同一個(gè)環(huán)。
    此時(shí),判斷p1->next與p2->next是否相等,如果相等則兩鏈表完全共環(huán);如果不相等,則完全不相交。

struct Node
{
     int m_data;
     Node *m_NextNode;
}
void InsertNode(&*node)//鏈表尾部插入新的節(jié)點(diǎn)
{
   Node *head;
   Node *newNode;
   int data;
   head=node;
   while(head->m_NextNode)
   head=head->m_NextNode;
   while(1)//在鏈尾添加新的節(jié)點(diǎn)
 {
    cin>>data;
    if(data==0)
     break;
    newNode=(Node *)malloc(sizeof(Node));
    if(!newNode)
     exit(ERROR);
    //newNode-->m_NextNode=NULL;
    head->m_NextNode=newNode;
    head=newNode;
    head->m_NextNode=NULL;
 }
}
 
// if there could exist cycle
int* isJoin(Node *h1,Node *h2)
{
   Node* cycle1=testCylic(h1);
   Node* cycle2=testCylic(h2);
   if(cycle1==0 && cycle2==0) //都無環(huán)
    return isJoinedSimple(h1,h2);
   if((cycle1==0 && cycle2!=0) ||(cycle1!=0 && cycle2==0))//一個(gè)有環(huán),一個(gè)無環(huán)
    return NULL;
   if(cycle1!=0 && cycle2!=0) //都有環(huán)
   {
      Node *pin1=pCycle(h1,cycle1);//環(huán)入口
      Node *pin2=pCycle(h2,cycle2);
      if(pin1==pin2)
      {
          while(pin1==pin2 && pin1>=h1 && pin2>=h2)
          {
             Node *ptemp=pin1;
             pin1--;
             pin2--;
          }
         return ptemp;
      }
    else
   {
        int len=0;
        while(pin1!=pin2 || len<500)
        {
           pin2++
         }
        if(len==500)
            return MULL;//完全不同的環(huán);
       else
             return pin1;//完全相同的環(huán);
     }
   }
}

//exist cycle?
int* testCylic(Node *h)
{
 *Node p1=h;
 *Node p2=h;
 while(p2!=NULL && p2->m_NextNode!=NULL)
 {
  p1=p1->m_NextNode;
  p2=p2->m_NextNode->m_NextNode;
 }
 if(p1==p2)
  return p1;
 else
  return NULL;
}
// if there is no cycle.
int* isJoinedSimple(Node *h1,Node *h2)
{
 int a=0;
 int b=0;
 int abs;
 Node *p1=h1;
 Node *p2=h2;
 while(p1->m_NextNode!=NULL)
 {
  p1=p1->m_NextNode;
  a++;
 }
  
 while(p2->m_NextNode!=NULL)
 {
  p2=p2->m_NextNode;
  b++
 }
 if(p1==p2)
  abs=a-b;
 if(abs>0)
 {
  p1=h1+abs;
  p2=h2;
 }
 else
 {
  abs=-abs;
  p1=h1;
  p2=h2+abs;
 }
 if(p1!=p2)
 {
  p1=p1->m_NextNode;
  p2=p2->m_NextNode;
 }
 return p1;
}
//求含有環(huán)形的鏈表的環(huán)入口點(diǎn)
Node* pCycle(Node* h, Node* cycle)
{
 Node* p=h;
 while(p!=cycle)
 {
  p=p->m_NextNode;
  cycle=cycle->m_NextNode;
 }
 return p;
}
 

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多