チェーンテーブルのよくある面接問題4:チェーンテーブルの交差問題を解決する


問題1:両チェーンテーブルが交差しているかどうかを判断する
問題解決の考え方:
それぞれ2つのチェーンテーブルを巡り、チェーンテーブルの末尾に達したときに2つのチェーンテーブルのノードが同じかどうかを判断し、同じであれば2つのチェーンテーブルが交差し、そうでなければ交際したくない.
//2つのチェーンテーブルが交差しているかどうかを判断し、2つのチェーンテーブルにループがないと仮定します.
int CheckCross(pList list1, pList list2)
{
 pLinkNode l1 = list1;
 pLinkNode l2 = list2;
 if (l1 == NULL || l2 == NULL)
 {
  return 0;
 }
 while (l1->next) 
 {
  l1 = l1->next;
 } //  l1       
 while (l2->next)
 {
  l2 = l2->next;
 }//  l2       
 if (l1 == l2) //                ,       1
 {
  return 1;
 }
 else
  return 0;//     0
}

問題2:もし2つのチェーンテーブルが交差するならば、この2つのチェーンテーブルの交点を求めます
問題解決の考え方:
2つのチェーンテーブルをそれぞれ巡回し、2つのチェーンテーブルの長さlen_を記録する.l 1とlen_l 2,長いチェーンテーブルの針を先に|len_l1 - len_l 2|ステップ、それから2つのポインタが一緒に歩いて、2つのポインタが出会ったノードは2つのチェーンテーブルの交点です.
pLinkNode LinkCrossNode(pList list1, pList list2)
{
 int len_l1=0;
 int len_l2 = 0;
 int len = 0;
 pLinkNode l1 = list1;
 pLinkNode l2 = list2;
 pLinkNode longlink = NULL;
 pLinkNode shortlink = NULL;
 while (l1)
 {
  len_l1++;
  l1 = l1->next;
 }//         
 while (l2)
 {
  len_l2++;
  l2 = l2->next;
 }//         
 if (len_l1 > len_l2)
 {
  len = len_l1 - len_l2;
   while (len--)
   {
   list1 = list1->next;
   }//      len = |len_l1 - len_l2| 
 }
 else
 {
  len = len_l2 - len_l1;
  while (len--)
  {
   list2 = list2->next;
  }//      len = |len_l1 - len_l2| 
 }
 
 while (list1!= list2)//      ,            
 {
  list1 = list1->next;
  list2 = list2->next;
 }
 return list1;
}