两个单链表交叉只能是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; }