#include "stdafx.h" struct Node { int value; Node * next; }; //判断是否有环,返回bool,如果有环,返回环里的节点 bool isCircle(Node * head, Node *& circleNode, Node *& lastNode) { Node * fast = head->next; Node * slow = head; while(fast != slow && fast && slow) { if(fast->next != NULL) fast = fast->next; if(fast->next == NULL) lastNode = fast; if(slow->next == NULL) lastNode = slow; fast = fast->next; slow = slow->next; } if(fast == slow && fast && slow) { circleNode = fast; return true; } else return false; } bool detect(Node * head1, Node * head2) { Node * circleNode1; Node * circleNode2; Node * lastNode1; Node * lastNode2; bool isCircle1 = isCircle(head1,circleNode1, lastNode1); bool isCircle2 = isCircle(head2,circleNode2, lastNode2); //一个有环,一个无环 if(isCircle1 != isCircle2) return false; //两个都无环,判断最后一个节点是否相等 else if(!isCircle1 && !isCircle2) { return lastNode1 == lastNode2; } //两个都有环,判断环里的节点是否能到达另一个链表环里的节点 else { Node * temp = circleNode1; while(temp != circleNode1) { if(temp == circleNode2) return true; temp = temp->next; } return false; } return false; } int _tmain(int argc, _TCHAR* argv[]) { Node * n1 = new Node(); Node * n2 = new Node(); Node * n3 = new Node(); Node * n4 = new Node(); n1->next = n2; n2->next = n3; n3->next = n4; n4->next = NULL; Node * n5 = new Node(); Node * n6 = new Node(); Node * n7 = new Node(); Node * n8 = new Node(); n5->next = n6; n6->next = n7; n7->next = n8; n8->next = n5; if(detect(n1,n2)) printf("相交\n"); else printf("不相交\n"); return 0; }