• 单向链表是否交叉


    问题描述:

      给定两个单向链表头指针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。

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

  • 相关阅读:
    【shell】sed指定追加模式空间的次数
    【shell】sed后向引用替换文本
    【c++】一道关于继承和析构的笔试题
    【curl】cookie的分隔符
    【shell】grep使用正则表达式
    【leetcode】Remove Duplicates from Sorted Array
    【shell】awk格式对齐文本
    【shell】sed处理多行合并
    【leetcode】Permutations
    BWSAP BW Performance Tuning URLS LIST
  • 原文地址:https://www.cnblogs.com/seeken/p/5650188.html
Copyright © 2020-2023  润新知