面试题-----判断两个无环单链表是否交叉,如果交叉返回交叉点

两个单链表交叉只能是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; 
}

 

    原文作者:青儿哥哥
    原文地址: https://www.cnblogs.com/qingergege/p/7825936.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞