单链表相交问题
問題:
1.單鏈表如何判斷是否相交?
2.單鏈表相交點的地址如何求出?
解決:
先來說一下單鏈表相交的樣式圖是圖一樣子的還是圖二樣子的
?是圖二樣子的,因為圖一樣子那個相交點的next域會有兩個指向,所以只能是第二中樣子的
1.判斷兩個單鏈表相交
思路:
?思路有了,代碼實現如下:
bool Intersect(PNode plist1, PNode plist2)
{//assertNode *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)
{//assertint 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*來接收
總結一下,兄弟們,鏈表相交在面試的時候會考(老師說的),還是值得多研究一下!希望這篇文章對大家有一定的幫助!
哪有什么歲月靜好,只不過有人再替我們負重前行,加油吧!
總結
- 上一篇: 求一个好听的杨姓名字!
- 下一篇: Linxu终端gcc与gcc -c的区别