1.判断链表带不带环
2.如果都不带环,就判断尾节点是否相等
3.如果都带环,判断一条链表上两指针相遇的那个节点,
在不在另一条链表上,如果在,则相交,如果不在,则不相交
那么如何判断是否带环?
设置两个指针 p1 、p2 开始都指向链表的头, p2 每次移动两步
p1每次移动一步,如果存在环,则他们必在环中相遇
#include<iostream>
#include<stdio.h>
#include<assert.h>
typedef struct Listnode
{
char data;
Listnode *next;
}Listnode;
Listnode *head = NULL;
/*
*如果链表有环,则他就没有尾节点,next的值不等于空
*/
bool iscircle (Listnode *head ,Listnode *& circlenode ,Listnode *& lastnode)
{
Listnode * fast = head -> next;
Listnode *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;
}
if(fast == slow && fast && slow)
{
circlenode = fast;
return true;
}
else
{
return false;
}
fast = fast ->next;
slow = slow ->next;
}
}
/* 如果都不带环,就判断尾节点是否相等,如果都带环,判断一链表上两指针相遇的那个节点,在不在另
*外一条链表上
*/
bool detect(Listnode *head1,Listnode *head2)
{
Listnode *circlenode1 = NULL;
Listnode *circlenode2 = NULL;
Listnode *lastnode1 = NULL;
Listnode *lastnode2 = NULL;
bool iscircle1 = iscircle(head1,circlenode1,lastnode1);
bool iscircle2 = iscircle(head1,circlenode2,lastnode2);
//一个有环,一个无环
if(iscircle1 != iscircle1)
{
return false;
}
//两个都无环,判断最后一个节点是否相等
else if(!iscircle1 && !iscircle2)
{
return lastnode1 == lastnode2;
}
//两个都有环,判断环里的节点是否在另一个链表环里的节点
else{
Listnode *temp = circlenode1 -> next;
while(temp != circlenode1)
{
if(temp == circlenode2)
{
return true;
}
temp = temp ->next;
}
return false;
}
return false;
}