两个不含环的单链表的相交
相交指的是结点的地址相同,而不是结点的值相同
************************************************************************/
- typedef struct node_t
- {
- int data;
- struct node_t *next;
- }node;
-
- node* find_node(node *head1, node *head2)
- {
- if(NULL == head1 || NULL == head2)
- {
- return NULL;
- }
- node *p1, *p2;
- p1 = head1;
- p2 = head2;
- int len1 = 0;
- int len2 =0;
- int diff = 0;
- while(NULL != p1->next)
- {
- p1 = p1->next;
- len1++;
- }
- while(NULL != p2->next)
- {
- p2 = p2->next;
- len2++;
- }
- if(p1 != p2)
- {
- return NULL;
- }
- diff = abs(len1 - len2);
- if(len1 > len2)
- {
- p1 = head1;
- p2 = head2;
- }
- else
- {
- p1 = head2;
- p2 = head1;
- }
- for(int i=0; i<diff; i++)
- {
- p1 = p1->next;
- }
- while(p1 != p2)
- {
- p1 = p1->next;
- p2 = p2->next;
- }
- return p1;
- }
链表中有环时
(1)当两个链表中有环时,相交的判断:
如果链表有环且相交,那么这两个链表都是有环的。
找到第一个链表的环点,然后将环断开(当然不要忘记了保存它的下一个节点),然后再来遍历第二个链表,如果发现第二个链表从有环变成了无环,那么他们就是相交的嘛,否则就是不相交的了。
当两个有环的链表相交时,有以下两种情况:
在这种情况下,两个链表的交点在环点之前,可以将环点切断,这样就变成了两个无环的链表求相交点。可使用以上方法。
另一种情况为:
在这种情况下,不存在所谓的相交点。
(2)当一个链表中有环,一个链表中没有环时,两个链表必不相交。