给定两个单链表的头节点head1和head2,如何判断两个链表是否相交?相交的话返回true,不想交的话返回false。
给定两个链表的头结点head1和head2(注意,另外两个参数adjust0和adjust1用于调整数据,与本题求解无关)。请返回一个bool值代表它们是否相交。
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};*/
class ChkIntersection {
public:
bool chkInter(ListNode* head1, ListNode* head2, int adjust0, int adjust1) {
// write code here
ListNode* p1,*p2;
p1=head1;
p2=head2;
ListNode* res1=chkCircle(p1);
ListNode* res2=chkCircle(p2);
if(res1==NULL&&res2) return false;
else if(res1&&res2==NULL) return false;
else if(res1&&res2)
{
if(res1==res2) return true; //该判断条件不可漏了,原因自己好好想想
ListNode* cur=res1->next;
while(cur!=res1)
{
if(cur==res2) return true;
cur=cur->next;
}
return false;
}
else
{
p1=head1;
p2=head2;
while(p1->next)
{
p1=p1->next;
}
while(p2->next)
{
p2=p2->next;
}
if(p1==p2) return true;
else return false;
}
}
ListNode* chkCircle(ListNode* head)
{
ListNode* fast=head;
ListNode* slow=head;
while(fast&&fast->next)
{
fast=fast->next->next;//这句代码需要放在条件语句之前,否则fast=slow=head,导致结果错误
slow=slow->next;
if(fast==slow)
{
break;
fast=head;
while(fast!=slow)//while语句放在条件语句内部
{
fast=fast->next;
slow=slow->next;
}
return fast;
}
}
if(fast&&fast->next) //此处的判断条件不能是slow==fast,需要考虑fast->next为空的情况
{
fast=head;
while(fast!=slow)//while语句放在条件语句内部
{
fast=fast->next;
slow=slow->next;
}
return fast;
}
else return NULL;
}
};