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


    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;
        }
    }
  • 相关阅读:
    你知道RAID的初始化过程吗?
    Dynamic Disk Pool技术解析
    Ubuntu-16.04.6 安装 oracle 11.2.0.4 数据库database软件
    Ubuntu-16.04.6 安装 oracle 12.2.0.1 数据库database软件
    IDEA 快捷键
    Redis 常用操作命令
    甘特图
    PERT图
    现金贷
    线上信贷提供解决方案
  • 原文地址:https://www.cnblogs.com/markliu/p/2515276.html
Copyright © 2020-2023  润新知