招考信息备考资料考试题库|面授课程网校课程微商城| 砖题库职位库文库直播|华图师资

  • 在线客服咨询
    广州 在线咨询
    深圳 在线咨询
    佛山 在线咨询
    珠海 在线咨询
    中山 在线咨询
    清远 在线咨询
    韶关 在线咨询
    东莞 在线咨询
    惠州 在线咨询
    汕头 在线咨询
    汕尾 在线咨询
    潮州 在线咨询
    揭阳 在线咨询
    梅州 在线咨询
    河源 在线咨询
    湛江 在线咨询
    肇庆 在线咨询
    江门 在线咨询
    阳江 在线咨询
    茂名 在线咨询
    云浮 在线咨询
    广东华图 在线咨询
  • 当前位置:深圳公务员考试网 > 华图题库 >

    阅读模式

    查询某个结点由哪些线(链)相交而成属于:()

    2022-04-26 12:26 深圳人事考试网 来源:广东华图教育

    题目

    查询某个结点由哪些线(链)相交而成属于:()
    A.线点查询
    B.点线查询
    C.线线查询
    D.点面查询

      

    优质答案

      正确答案

    方法一:直接法
       直接判断第一个链表的每个结点是否在第二个链表中,时间复杂度为O(len1*len2),耗时很大
    方法二:利用计数
    如 果 两个链表相交,则两个链表就会有共同的结点;而结点地址又是结点唯一标识。因而判断两个链表中是否存在地址一致的节点,就可以知道是否相交了。可以对第一 个链表的节点地址进行hash排序,建立hash表,然后针对第二个链表的每个节点的地址查询hash表,如果它在hash表中出现,则说明两个链表有共 同的结点。这个方法的时间复杂度为:O(max(len1+len2);但同时还得增加O(len1)的存储空间存储哈希表。这样减少了时间复杂度,增加 了存储空间。
    以链表节点地址为值,遍历第一个链表,使用Hash保存所有节点地址值,结束条件为到最后一个节点(无环)或Hash中该地址值已经存在(有环)。
    再遍历第二个链表,判断节点地址值是否已经存在于上面创建的Hash表中。
    这个方面可以解决题目中的所有情况,时间复杂度为O(m+n),m和n分别是两个链表中节点数量。由于节点地址指针就是一个整型,假设链表都是在堆中动态创建的,可以使用堆的起始地址作为偏移量,以地址减去这个偏移量作为Hash函数
    方法三
    两个没有环的链表相交于一节点,则在这个节点之后的所有结点都是两个链表所共有的。如果它们相交,则最后一个结点一定是共有的,则只需要判断最后一个结点是否相同即可。时间复杂度为O(len1+len2)。对于相交的第一个结点,则可求出两个链表的长度,然后用长的减去短的得到一个差值 K,然后让长的链表先遍历K个结点,然后两个链表再开始比较。还可以这样:其中一个链表首尾相连,检测另外一个链表是否存在环,如果存在,则两个链表相交,而检测出来e68a84e8a2ade799bee5baa631333335313161的依赖环入口即为相交的第一个
    /************************************************************************/
    /* 两个不含环的单链表的相交
       相交指的是结点的地址相同,而不是结点的值相同                        */
    /************************************************************************/ #include<iostream>
    #include<malloc.h>
    #include<stdlib.h>
    #define  ERROR 0
    using namespace std;struct LinkList//链表结构体
    {
     int m_nValue;
     LinkList *next;
    };
    void InsertList(LinkList *&list)//建立一个链表
    {
        LinkList *head;
        LinkList *newNode;
        int data;     head=list;
        while(head->next)
         head=head->next;     while(1)//链尾法构造链表
        {  
       cin>>data;
       if(data==0)break;   
      newNode=(LinkList *)malloc(sizeof(LinkList));
      if(!newNode)exit(ERROR);
            newNode->m_nValue=data;
      newNode->next=NULL;
      head->next=newNode;
            head=newNode;
      head->next=NULL;
      } }
    void Traverse(LinkList *list)//输出链表
    {
     LinkList *p;
     p=list->next;
     while(p)
     {
      cout<<" "<<p->m_nValue<<"    address= "<<p<<endl;
      p=p->next;
     }
    }
    int main()
    {
     LinkList *first,*second;
     LinkList *fhead,*shead,*h1,*h2,*p,*q;
     int flen=0,slen=0,len;
     first=(LinkList *)malloc(sizeof(LinkList));
     first->next=NULL;
     second=(LinkList *)malloc(sizeof(LinkList));
     second->next=NULL;
     InsertList(first);//构造第一个链表
     cout<<endl;
     InsertList(second);//构造第二个链表
       ///////////////////////////////////////////////// 
       //将第一个链表中从第四个结点起链接到第二个链表,构造两个相交的链表
     p=second;
       while(p->next)
        p=p->next;//找到第二个链表的尾结点    q=first;
       for(int i=0;i<4;i++)
           q=q->next;//找到第一个链表的第四个结点
       p->next=q;//插入到第二个链表中
      //////////////////////////////////////////////////
     Traverse(first);
     cout<<endl;
        Traverse(second);
     cout<<endl;
        h1=first->next;
     fhead=first;
     while(fhead->next)//遍历链表到表尾 (执行length1次,记n2次)
     {
      fhead=fhead->next;
      flen++;
     }
        h2=second->next;
     shead=second;
     while(shead->next)//遍历链表到表尾, (执行length2次,记n1次)
     {
      shead=shead->next;
      slen++;
     }
      if(fhead==shead)//最后一个结点的地址相同,则相交
     { 
      cout<<"两链表相交"<<endl;
     if(flen>=slen)//求两个链表长度的差值
     {
      len=flen-slen;
      while(len--) //遍历差值个步长 (执行abs(length1-length2)次)
               h1=h1->next;  
     }
     else
     {
      len=slen-flen;
      while(len--)
       h2=h2->next; 
     }
     while(1)
     {   if(h1==h2)//两个链表中地址相同的结点   (最多执行的次数为:min(length1,length2))
      {
        cout<<"第一个相交的结点:"<<h1->m_nValue;
       break;
      }
      else if(h1->next&&h2->next)
      {
       h1=h1->next;
       h2=h2->next;
      } 
     }
     }
     else 
      cout<<"两链表不相交"<<endl; }

      

    解析

      解析同上

      以上是关于查询某个结点由哪些线(链)相交而成属于:() 的参考答案及解析。详细信息你可以登陆深圳公务员考试网。如有疑问,欢迎向华图教育企业知道提问。点击咨询>>>

    知识点一点点得积累,那么作为解决问题来说,检验标准就是做题了。

    做题演练,让知识点更加牢固,也可以在这知识点的海洋里自由地鱼跃。

    不放过每次的实战!加油!

    找考试题目使用:搜答案神器(https://shenzhen.huatu.com/tiku/


      特别说明:深圳华图题库系统旨在为考生提供高效的智能备考服务,全面覆盖公务员考试、事业单位、教师招聘、职业资格、医卫类、计算机类等领域。拥有优质丰富的学习资料和备考全阶段的高效服务,助您不断前行!关注深圳华图教育微信szhuatu,政策问题实时答,考试信息不漏看。

      华图题库平台所收集的试题内容来源于互联网,仅供学习交流使用,不构成商业目的。版权归原作者所有,如涉及作品内容、版权和其它问题,请与我们取得联系,我们将在第一时间处理,维护您的合法权益。

    (编辑:深圳华图)

    广东华图官方微信 广东华图官方微信 微信号:gdhtgwy
    首页 咨询 课程
    首页 招考信息 网站地图 返回顶部