百度笔试算法第二题:如何判断两个单向链表是否有相交,并找出交点

1.复杂的就是一个一个的判断,复杂度O(m*n);

2.稍微便捷点的就是判断最后一个节点是否相等,复杂度O(m+n);

3.知道了两个链表的长度len1,len2,那么先让长的链表向后遍历abs(len1-len2),再进行同时遍历并一对一比较,这样的话复杂度为O(max(m,n))。

O(m+n)的代码如下:

View Code
/*===========================================================================
* Function name:   FindNode
* Parameter:       pHead1,pHead2分别为待判断的链表头结点
* Precondition:    两个链表已经建立
* Postcondition:   NONE
* Description:     判断两个单向链表是否有交点并返回交点
* Return value:    交点
===========================================================================*/
NODE* FindNode(NODE* pHead1, NODE* pHead2)
{
    NODE* p1 = pHead1;
    NODE* p2 = pHead2;
    int i = 1, j = 1, k = 0, f = 0;

    if(pHead2 == NULL || pHead2 == NULL)
    {
        return NULL;
    }

    while(p1->next != NULL)
    {
        p1 = p1->next;
        i++;
    }

    while(p2->next != NULL)
    {
        p2 = p2->next;
        j++;
    }

    if(p1 != p2)
    {
        return NULL;
    }
    else
    {

        f = fabs(i, j);
        if(i > j)
        {
            p1 = pHead1;
            p2 = pHead2;
        }
        else
        {
            p1 = pHead2;
            p2 = pHead1;
        }
        for(k=0; k<f; k++)
        {
            p1 = p1->next;
        }
        while(p1 != p2)
        {
            p1 = p1->next;
            p2 = p2->next;
        }
        return p1;
    }
}
原文地址:https://www.cnblogs.com/markliu/p/2515276.html