zoukankan      html  css  js  c++  java
  • 百度笔试算法第二题:如何判断两个单向链表是否有相交,并找出交点

    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;
        }
    }
  • 相关阅读:
    你的灯亮着吗随笔2
    好搜--评价
    水王ID
    回溯算法
    贪心算法
    动态规划问题
    环境安装注意事项
    好用的idea插件记录
    软件工程项目冲刺阶段二:第七天
    软件工程项目冲刺阶段二:第六天
  • 原文地址:https://www.cnblogs.com/markliu/p/2515276.html
Copyright © 2011-2022 走看看