问题:
1.单链表如何判断是否相交?
2.单链表相交点的地址如何求出?
解决:
先来说一下单链表相交的样式图是图一样子的还是图二样子的
是图二样子的,因为图一样子那个相交点的next域会有两个指向,所以只能是第二中样子的
1.判断两个单链表相交
思路:
思路有了,代码实现如下:
bool Intersect(PNode plist1, PNode plist2)
{
//assert
Node *p = plist1;
Node *q = plist2;
for(p; p->next!=NULL; p=p->next); //此时p一定在plist1的尾结点
for(q; q->next!=NULL; q=q->next); //此时q一定在plist2的尾结点
return p==q ? true : false;
/*if(p == q)
{
return true;
}
return false;*/
}
上述三目运算那块可以用下面的if替代,没有任何区别!
2.单链表相交的首地址
思路:
思路有了 代码实现:
Node* Intersect_get_first(PNode plist1, PNode plist2)
{
//assert
int len1 = Get_Length(plist1); //自定义求单链表长度的函数
int len2 = Get_Length(plist2);
Node *p = len1>=len2 ? plist1 : plist2; //三目运算求两条链表中长短链表进行赋值
Node *q = len1>=len2 ? plist2 : plist1;
for(int i=0; i<abs(len1-len2); i++) //abs是求绝对值的一个函数,这里就是为了保证为正数
{
p = p->next; //长链走了先走比短链多出来的那部分
}
while(p != NULL)
{
if(p == q)
{
return p;//return q;
}
p=p->next; //p,q同时开始走,直至相遇return 相遇点
q=q->next;
}
return NULL;
}
//函数返回值要Node*的原因是这个返回的类型是一个Node类型的指针,所以拿Node*来接收
总结一下,兄弟们,链表相交在面试的时候会考(老师说的),还是值得多研究一下!希望这篇文章对大家有一定的帮助!