链表的相交与环问题_第1页
链表的相交与环问题_第2页
链表的相交与环问题_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、给出两个单向链表的头指针pHeadl和pHead2,判断这两个链表是否相交。假设两个链表均不带环。示意图如下:*NULL*NULL如果两个链表相交于某一节点,那么在这个相交节点之后的所有节点都是两个链表所共有的。也就是说,如果两个链表相交,那么最后一个节点肯定是共有的。先遍历第一个链表,记住最后一个节点,然后遍历第二个链表,到最后一个节点时和第一个链表的最后一个节点做比较,如果相同,则相交,否则不相交。时间复杂度为O(lenl+len2),因为只需要一个额外指针保存最后一个节点地址,空间复杂度为0(1)。(编程之美上面有详细的介绍)2、给出一个单向链表的头指针pHead,判断链表中是否有环。示意图如下:链表中有环,其实也就是自相交。我们用两个指针pslow和pfast从头开始遍历链表,pslow每次前进一个节点,pfast每次前进两个结点,若存在环,则pslow和pfast肯定会在环中相遇,若不存在,则pslow和pfast能正常到达最后一个节点(实际上是到达NULL)。代码如下://判断链表中是否有环boolIsExitLoop(LinkList*head){LinkList*pslow=head;LinkList*pfast=head;while(pfast!=NULL&&pfast->next!=NULL){pslow=pslow->next;//每次前进一步pfast=pfast->next->next;//每次前进二步if(pslow==pfast) //两个指针相遇,说明存在环returntrue;returnfalse;//没有环2、给出两个单向链表的头指针pHeadl和pHead2,判断这两个链表是否相交,若相交返回第一个相交的节点。假设两个链表均不带环。方法一:判断两个链表中是否存在地址一致的节点,就可以知道是否相交了。可以对第一个链表的节点地址进行hash排序,建立hash表,然后针对第二个链表的每个节点的地址查询hash表,如果它在hash表中出现,则说明两个链表有共同的结点。这个方法的时间复杂度为:O(max(len1+len2);但同时还得增加O(lenl)的存储空间存储哈希表。这样减少了时间复杂度,增加了存储空间。以链表节点地址为值,遍历第一个链表,使用Hash保存所有节点地址值,结束条件为到最后一个节点(无环)或Hash中该地址值已经存在(有环)。方法二:对第一个链表遍历,计算长度lenl,同时保存最后一个节点的地址。对第二个链表遍历,计算长度len2,同时检查最后一个节点是否和第一个链表的最后一个节点相同,若不相同,则不相交,程序结束。若相交,两个链表均从头节点开始,假设lenl大于len2,那么将第一个链表先遍历len1-len2个节点,此时两个链表当前节点到第一个相交节点的距离就相等了,比较下一个节点是不是相同,如果相同就返回该节点(即相交节点),若不相同,两个链表都同步向后走一步,继续比较。示意图如下:方法三:由于两个链表都没有环,我们可以把第二个链表接在第一个链表的后面,如果得到的链表有环,则说明这两个链表相交。否则,这两个链表不相交。这样我们就把问题转化为判断一个链表是否有环了。最后,当然可别忘记恢复原来的状态,去掉从第一个链表到第二个链表表头的指向。4、给出一个单向链表的头指针pHead,判断链表中是否有环,若存在,则求出进入环中的第一个节点。示意图如下:红色虚线框中的节点为待求节点。首先使用第2个题目中的快、慢指针来判断链表是否存在环,若不存在结束。若链表中存在环,我们从链表头、与两个指针的相遇点分别设一个指针,每次各走一步,两个指针必定相遇,且相遇的第一个点为环的入口点。代码如下://找到环的第一个入口点LinkList*FindLoopPort(LinkList*head){LinkList*pslow=head;LinkList*pfast=head;while(pfast!=NULL&&pfast->next!=NULL){pslow=pslow->next;//每次前进一步pfast=pfast->next->next;//每次前进二步if(pslow==pfast) //两个指针相遇,说明存在环break;}if(pfast==NULL||pfast->next==NULL)//不存在环returnNULL;pslow=head;while(pslow!=pfast){pslow=pslow->next;//每次前进一步pfast=pfast->next;//每次前进一步}returnpslow;//返回环的入口点}分析:当pfast若与pslow相遇时,pslow肯定没有走遍历完链表,而pfast已经在环内循环了n圈(1<=n)。假设pslow走了s步,则pfast走了2s步(pfast步数还等于s加上在环上多转的n圈),设环长为r,则:2s=s+nrs=nr设整个链表长匚入口环与相遇点距离为x,起点到环入口点的距离为a。 a+x=nr则a+x=(n-1)r+r=(n-1)r+L-aa=(n-1)r+(L-a-x)(L-a-x)为相遇点到环入口点的距离,由此可知,从链表头到环入口点等于(n-1)循环内环+相遇点到环入口点,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论