連続する単一チェーンテーブルが交差しているかどうかを判断し、交差点を見つけます.
2900 ワード
チェーンテーブルが交差している場合、2つのチェーンテーブルの形態はYまたはV型であるべきであるため、2つのチェーンテーブルが交差しているかどうかを判断するには2つの方法がある.
一、2つのチェーンテーブルの末尾が同じかどうかを比較し、同じであれば2つのチェーンテーブルが交差し、交差点は2つのチェーンテーブルの長さ差で計算することができる.等しくなるまで別々に遍歴するのが交点の所在です.
交点を探す:
二、2つのチェーンテーブルが交差している場合、1つのチェーンテーブルの先頭と末尾を接続すると、2つのチェーンテーブルが一緒になるとリング付きチェーンテーブルが形成され、問題は単一チェーンテーブルにリングがあるかどうかの問題に帰結する.
一、2つのチェーンテーブルの末尾が同じかどうかを比較し、同じであれば2つのチェーンテーブルが交差し、交差点は2つのチェーンテーブルの長さ差で計算することができる.等しくなるまで別々に遍歴するのが交点の所在です.
int IsCross(ListNode *p, ListNode *q){
if(p == NULL || q == NULL){
return 0;
}
ListNode *node1 = NULL;
ListNode *node2 = NULL;
while(p != NULL){
node1 = p;
p = p->next;
}
while(q != NULL){
node2 = q;
q = q->next;
}
if(node1 == node2){
return 1;
}else{
return 0;
}
}
交点を探す:
ListNode *FindNode(ListNode *p, ListNode *q){
if(p == NULL || q == NULL){
return NULL;
}
ListNode *node1 = p;
ListNode *node2 = q;
int len1 = 0, len2 = 0;
while(node1 != NULL){
node1 = node->next;
len1++;
}
while(node2 != NULL){
node2 = node2->next;
len2++;
}
int len = len1 > len2 ? len1 - len2 : len2 -len1;
ListNode *lenNode = len1 > len2 ? p : q;
ListNode *shortNode = len1 < len2 ? p : q;
for(int i = 0; i < len + 1;i++){
lenNode = lenNode->next;
}
while(shortNode != NULL && lenNode != NULL && shortNode != lenNode){
shortNode = shortNode->next;
lenNode = lenNode->next;
}
return shortNode;
}
二、2つのチェーンテーブルが交差している場合、1つのチェーンテーブルの先頭と末尾を接続すると、2つのチェーンテーブルが一緒になるとリング付きチェーンテーブルが形成され、問題は単一チェーンテーブルにリングがあるかどうかの問題に帰結する.
int IsCross(ListNode *p, ListNode *q){
if(p == NULL || q == NULL){
return 0;
}
ListNode *t = p;
while(t->next != NULL){
t = t->next;
}
t->next = p;
ListNode *fast = q;
ListNode *slow = q;
while(fast != NULL && fast->next != NULL){
fast = fast->next->next;
slow = slow->next;
if(fast == slow){
break;
}
}
if(fast != NULL && fast->next != NULL){
return 1;
}else{
return 0;
}
}