単鎖表(七)——両鎖表が交差しているかどうかを判断する
2つのチェーンテーブルが交差しているかどうかを判断するには、主に以下の3つの方法があります.
1、最も簡単な方法は、まず一つのチェーンテーブルに順番にアクセスすることであり、一つのノードにアクセスするたびに、もう一つのチェーンテーブルを遍歴し、ノードが等しいかどうかを見て、一つの等しいノード位置が見つかるまで、チェーンテーブルの長さがそれぞれmであれば、nの時間複雑度はO(mn)である.
2、2つのチェーンテーブルに共通ノードがある場合、その共通ノードの後のすべてのノードは2つのチェーンテーブルで共有されているので、長さも一定であり、2つのチェーンテーブルの総長さが等しい場合、2つのチェーンテーブルを遍歴すると、必ず最初の共通ノードに到達することがわかります.しかし、チェーンテーブルの長さは実際には必ずしも同じではないので、2つのチェーンテーブルの長さの差nを計算し、長いチェーンテーブルを先にnステップ移動させ、短いチェーンテーブルを後ろに回し始めるだけで、彼らは必ず最初の共通ノードに同時に到着します.2つのチェーンテーブルのノードが等しいかどうかを後方に移動するときに比較するだけで、最初の共通ノードを得ることができます.時間的複雑度はO(m+n)
3、チェーンテーブルの1つの先頭と末尾を接続し、別のチェーンテーブルにリングが含まれているかどうかを判断することができます.リングが含まれている場合、2つのチェーンテーブルが交差します.そうでなければ、交差しません.時間的複雑度はO(max[m,n])
以下、方法2について実現する
1、最も簡単な方法は、まず一つのチェーンテーブルに順番にアクセスすることであり、一つのノードにアクセスするたびに、もう一つのチェーンテーブルを遍歴し、ノードが等しいかどうかを見て、一つの等しいノード位置が見つかるまで、チェーンテーブルの長さがそれぞれmであれば、nの時間複雑度はO(mn)である.
2、2つのチェーンテーブルに共通ノードがある場合、その共通ノードの後のすべてのノードは2つのチェーンテーブルで共有されているので、長さも一定であり、2つのチェーンテーブルの総長さが等しい場合、2つのチェーンテーブルを遍歴すると、必ず最初の共通ノードに到達することがわかります.しかし、チェーンテーブルの長さは実際には必ずしも同じではないので、2つのチェーンテーブルの長さの差nを計算し、長いチェーンテーブルを先にnステップ移動させ、短いチェーンテーブルを後ろに回し始めるだけで、彼らは必ず最初の共通ノードに同時に到着します.2つのチェーンテーブルのノードが等しいかどうかを後方に移動するときに比較するだけで、最初の共通ノードを得ることができます.時間的複雑度はO(m+n)
3、チェーンテーブルの1つの先頭と末尾を接続し、別のチェーンテーブルにリングが含まれているかどうかを判断することができます.リングが含まれている場合、2つのチェーンテーブルが交差します.そうでなければ、交差しません.時間的複雑度はO(max[m,n])
以下、方法2について実現する
/*********************************************************************
* :linklist *IsCross(linklist *head1, linklist *head2)
* : 。
, head1 ;
, NULL
* :head1----
head2----
* : , NULL
* :
*********************************************************************/
linklist *IsCross(linklist *head1, linklist *head2)
{
linklist *tp1=head1, *tp2=head2;
int NodeNum1=0, NodeNum2=0; // 2
if(head1==NULL || head2==NULL)
return NULL;
// 1
while(tp1->next!=NULL)
{
NodeNum1++;
tp1 = tp1->next;
}
// 2
while(tp2->next!=NULL)
{
NodeNum2++;
tp2 = tp2->next;
}
if(tp1!=tp2) // ,
return NULL;
else //
{
int i;
tp1 = head1->next;
tp2 = head2->next;
if(NodeNum1 > NodeNum2)
{
for(i=0; inext;
while(tp1->next!=NULL)
if(tp1==tp2)
return tp1;
else
{
tp1 = tp1->next;
tp2 = tp2->next;
}
}
else
{
for(i=0; inext;
while(tp1->next!=NULL)
if(tp1==tp2)
return tp1;
else
{
tp1 = tp1->next;
tp2 = tp2->next;
}
}
}
}