面試題-----判斷兩個無環單鏈表是否交叉,如果交叉返回交叉點


兩個單鏈表交叉只能是Y型,所以可以通過判斷最后一個節點是否為同一個節點來判斷是否交叉

bool IsCross(Node *head1, Node *head2)
{
     if (!head1 || !head2) {
         return false;
     }
     
     Node *p1 = head1;
     Node *p2 = head2;    
     while (p1->next) {
         p1 = p1->next;
     }
     while (p2->next) {
         p2 = p2->next;
     }
     
     return (p1 == p2);
}

 

 

找出交點:遍歷兩個鏈表,記錄長度分別為L1和L2,先讓長的鏈表向后移動abs(L1-L2),然后在逐個比較結點,第一個相等的結點即為交點。

 

Node *FindCross(Node *head1, Node *head2)
{
     if (!head1 || !head2) {
         return NULL;
     }
     
     /* 求出兩個鏈表的長度 */
     Node *p1, *p2;
     p1 = head1;
     p2 = head2;
     int len1, len2, len;
     len1 = len2 = 0;    
     while (p1) {
         len1++;
         p1 = p1->next;
     } 
     while (p2) {
         len2++;
         p2 = p2->next;
     }
     
     /* 將長鏈表先移動len個結點 */
     int i;
     len = abs(len1 - len2);
     p1 = head1;
     p2 = head2;
     if (len1 > len2) {
         for (i = 0; i < len; ++i) {
             p1 = p1->next;
         }
     } else {
         for (i = 0; i < len; ++i) {
             p2 = p2->next;
         }
     }
     
     /* 遍歷 找到第一個相等的結點即為交點 */    
     while (!p1) {
         p1 = p1->next;
         p2 = p2->next;
         if (p1 == p2) {
             return p1;
         }
     }
     
     return NULL; 
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM