zoukankan      html  css  js  c++  java
  • 单向链表是否交叉

    问题描述:

      给定两个单向链表头指针H1,H2,问这俩链表是否相交,如果相交,给出第一次相交的节点。

     方案:

      分几种情况讨论:

      一:H1 H2均为无环链表

        这种情况相对比较简单,无环链表相交只能是Y型,也可以理解为T型,如果相交,则它们的最后一个节点必定重复,所以只需判断H1.end() == H2.end()即可。

        当判断出确实相交以后,根据H1 H2的长度同时结合快慢指针就可以找到第一次相交的节点,比如H1长度为A,H2长度为B,且A>B,说明H1头结点到所求点的距离比H2头结点到所求点的位置长(A - B),这样用两个指针分别指向H1 H2头结点,叫P1 P2

        让P1向后移动(A - B),然后P1 P2同时向后移动,它们相遇的地方就是所求的节点位置。

      二:H1 H2只有一个无环链表

        这种情况,两个链表绝对不会相交。

      三:H1 H2均有环

        这种情况就会比较复杂。仍然分两步,第一步判断是否相交,相交也分两种情况:

        

                      图1

          

                      图2

         如图所示,如果相交只有这两种情况,图1中,H1 H2他们的环点都在B(环点:本人自定义的一个概念,就是有环单向链表的交叉点),所以如果H1 H2的环点相等,那么二者相交;图二中,二者的环点分别为A B,用一个指针指向A,并一直向后移动,在遇到A之前如果没有遇到B,那么

    说明二者不相交,如果遇到B则相交。

        下面讨论它们初次相交的节点位置。

        仍然是分两种情况,如果是图一,那么方法和两个无环链表一样,首先是计算出二者的长度,然后结合快慢指针就可以找到节点A。

        如果是图二,那么不存在初次相交的节点位置。  

  • 相关阅读:
    pip安装pyinstaller失败的解决方法
    导药仪端子接线方式
    聊聊信号的回勾和过冲(转)
    玩不好触发,就不算会用示波器
    TI DS125BR401A 官方DEMO板鉴赏+学习+分析
    导药仪射频卡连接线制作方式
    解决ISE14.7在win10中不稳定的问题
    VS2013编译VTK7.1.1
    QT5.8.0与VS2013环境配置
    The Architecture of Open Source Applications---VTK
  • 原文地址:https://www.cnblogs.com/seeken/p/5650188.html
Copyright © 2011-2022 走看看