兩個單鏈表交叉只能是Y型,所以可以通過判斷最后一個節點是否為同一個節點來判斷是否交叉
bool IsCross(Node *head1, Node *head2) { if (!head1 || !head2) { return false; } Node *p1 = head1; Node *p2 = head2; while (p1->next) { p1 = p1->next; } while (p2->next) { p2 = p2->next; } return (p1 == p2); }
找出交點:遍歷兩個鏈表,記錄長度分別為L1和L2,先讓長的鏈表向后移動abs(L1-L2),然后在逐個比較結點,第一個相等的結點即為交點。
Node *FindCross(Node *head1, Node *head2) { if (!head1 || !head2) { return NULL; } /* 求出兩個鏈表的長度 */ Node *p1, *p2; p1 = head1; p2 = head2; int len1, len2, len; len1 = len2 = 0; while (p1) { len1++; p1 = p1->next; } while (p2) { len2++; p2 = p2->next; } /* 將長鏈表先移動len個結點 */ int i; len = abs(len1 - len2); p1 = head1; p2 = head2; if (len1 > len2) { for (i = 0; i < len; ++i) { p1 = p1->next; } } else { for (i = 0; i < len; ++i) { p2 = p2->next; } } /* 遍歷 找到第一個相等的結點即為交點 */ while (!p1) { p1 = p1->next; p2 = p2->next; if (p1 == p2) { return p1; } } return NULL; }