チェーンテーブル-2つのチェーンテーブルの交差に関する問題


1.2つのチェーンテーブルが交差しているかどうかを判断し、交差している場合は交点を求める.(チェーンテーブルにリングがないと仮定)
2.2つのチェーンテーブルが交差しているかどうかを判断し、交差している場合は交点を求める.(チェーンテーブルにループがある可能性があると仮定)【アップグレード版】
1.分析:チェーンテーブルにループがないことが知られている場合、2つのチェーンテーブルの末尾が同じであれば交差し、高速・低速ポインタで交点を求める.
ListNode* GetMeetNode(ListNode* list1,ListNode* list2)//     
{
   ListNode* cur1 = list1;
   ListNode* cur2 = list2;
   int len1 = 0;
   int len2 = 0;
   while(cur1)
   {
       len1++;
       cur1 = cur1->next;
    }
    while(cur2)
   {
       len2++;
       cur2 = cur2->next;
    }
    ListNode* longlist = list1;
    ListNode* shortlist = list2;
    if(len1 < len2)
    {
         longlist = list2;
         shortlist = list1;
     }
     int gap = abs(len1-len2);
     while(gap--)
     {
         longlist = longlist->next;
     }
     while(longlist)
     {
        if(longlist == shortlist)
        {
             return longlist;
        }
        longlist = longlist->next;
        shortlist = shortlist->next;
     }
     return NULL;
}

2.分析:L 1とL 2にループがあるかどうかを判断する
a.L 1とL 2はすべて環を持っていないで、チェーンテーブルの尾が環を持っているかどうかを求めて、交点を求めます
b.L 1バンドリング、L 2非バンドリングまたはL 1非バンドリング、L 2バンドリング.L 1とL 2は必ず交わらない
c.L 1とL 2はいずれもループ付き
1)入口点がリングの外側にある—>交点+入口点
2)入口点がリング内にある->2つの点が交点であり入口点である
3)バンドリングが交差しない
ListNode* Istersect(ListNode* plist1, ListNode* plist2)//             
{  
    //         
    if ((plist1 == NULL) || (plist2 == NULL))  
    {  
        return NULL;  
    }  
    ListNode* enter1 = EnterNode(plist1);  
    ListNode* enter2 = EnterNode(plist2);  
    //1.        ,              
    if ((enter1 == NULL) && (enter2 == NULL))  
    {  
        return IsListIntersect(plist1, plist2);  
    }  
        //2.     ,    ,    ,  NULL  
       else if ((enter1 == NULL) && (enter2 != NULL) || (enter1 != NULL) && (enter2 == NULL))  
    {  
        return NULL;  
    }  
    //3.1            ,   ,           
    else if (enter1 == enter2)  
    {  
        enter1->next = NULL;  
        enter2->next = NULL;  
        return IsListIntersect(plist1, plist2);  
    }  
    //3.2   ,                  ,                
        //      plist1        
    else  
    {  
        ListNode* tmp = enter1->next;  
        while (tmp != enter1)  
        {  
            if (tmp == enter2)  
            {  
                return enter1;  
            }  
            tmp = tmp->next;  
        }  
        return NULL;  
    }  
}