チェーンテーブル-2つのチェーンテーブルの交差に関する問題
2498 ワード
1.2つのチェーンテーブルが交差しているかどうかを判断し、交差している場合は交点を求める.(チェーンテーブルにリングがないと仮定)
2.2つのチェーンテーブルが交差しているかどうかを判断し、交差している場合は交点を求める.(チェーンテーブルにループがある可能性があると仮定)【アップグレード版】
1.分析:チェーンテーブルにループがないことが知られている場合、2つのチェーンテーブルの末尾が同じであれば交差し、高速・低速ポインタで交点を求める.
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)バンドリングが交差しない
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;
}
}