1.判断两个链表是否相交
两个链表是否相交可分为以下几种情况
(1)两个链表都不带环,此时两个链表所对应的最后一个节点是相等的
(2)两个链表一个带环,一个不带环,两个链表一定不相交
(3)连个链表都带环,如果相交则可以分为以下三种情况
1)两个链表在环外相交, 此时链表1 和链表2 对应的环的入口地址是相等的
2)两个链表在换上相交,此时从一个环的入口地址出发,一定可以到达另一个环的入口
3)如果不是以上两种情况,则连个链表一定不相交
/*
*
*链表是否相交没有环
*
*/
int LinkListHasCrossWithCircle(LinkNode* head1, LinkNode* head2)
{
if(head1 == NULL || head2 == NULL)
{
return 0;
}
LinkNode* cur1 = head1;
while(cur1 -> next != NULL)
{
cur1 = cur1 -> next;
}
LinkNode* cur2 = head2;
while(cur2 -> next != NULL)
{
cur2 = cur2 -> next;
}
if(cur1 == cur2)
{
return 1;
}
return 0;
}
/*
*
* 链表是否相交,不确定有没有环
*
*/
int LinkListHasCrossWithCircle2(LinkNode* head1, LinkNode* head2)
{
if(head1 == NULL || head2 == NULL)
{
return 0;//两链表至少一个为空
}
LinkNode* circle1 = LinkListHasCircle(head1);
LinkNode* circle2 = LinkListHasCircle(head2);
//两个链表都不带环
if(circle1 == NULL && circle2 == NULL)
{
return LinkListHasCrossWithCircle(head1, head2);
}
//两链表都带环
else if(circle1 != NULL && circle2 != NULL)
{
//在环外相交
LinkNode* entry1 = LinkListGetCircleEntry(head1);
LinkNode* entry2 = LinkListGetCircleEntry(head2);
if(entry1 == entry2)
{
return 1;
}
//再换上相交
else if(entry1 != entry2)
{
LinkNode* cur1 = entry1;
//从一个环入口点出发可以到达另外一个环入口点,则证明相交
while(cur1 != entry2)
{
cur1 = cur1 -> next;
}
return 1;
}
//不是上述情况则没有相交
return 0;
}
//一个带环一个不带环,则一定不相交
else if( ( circle1 == NULL && circle2 != NULL )
|| (circle1 != NULL && circle2 == NUL