チェーンテーブルのよくある面接問題4:チェーンテーブルの交差問題を解決する
問題1:両チェーンテーブルが交差しているかどうかを判断する
問題解決の考え方:
それぞれ2つのチェーンテーブルを巡り、チェーンテーブルの末尾に達したときに2つのチェーンテーブルのノードが同じかどうかを判断し、同じであれば2つのチェーンテーブルが交差し、そうでなければ交際したくない.
//2つのチェーンテーブルが交差しているかどうかを判断し、2つのチェーンテーブルにループがないと仮定します.
問題2:もし2つのチェーンテーブルが交差するならば、この2つのチェーンテーブルの交点を求めます
問題解決の考え方:
2つのチェーンテーブルをそれぞれ巡回し、2つのチェーンテーブルの長さlen_を記録する.l 1とlen_l 2,長いチェーンテーブルの針を先に|len_l1 - len_l 2|ステップ、それから2つのポインタが一緒に歩いて、2つのポインタが出会ったノードは2つのチェーンテーブルの交点です.
問題解決の考え方:
それぞれ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;
}