zoukankan      html  css  js  c++  java
  • 编程判断两个链表是否相交 结构之法 6

        给出两个单向链表的头指针,比如h1和h2,判断这两个链表是否相交。这里为了简化问题,我们假设两个链表均不带环。

    解法一:直观的想法

     先判断第一个链表的每个节点是否在第二个链表中。这种方法的时间复杂度为O(Length(h1)*Length(h2))。

       可见,这种方法很耗时间。

    解法二:利用计数的方法

       易知,如果两个链表相交,那么这两个链表就会有共同的节点。而节点的地址又是节点的唯一标志。所以,我们能够判断两个链表中是否存在地址一致的节点,就可以知道这两个链表是否相交。简单的做法:对第一个链表的节点地址进行hash排序,建立hash表,然后针对第二个链表的每个节点的地址查询hash表,如果它在hash表中出现,说明第二个链表和第一个链表有共同的节点。时间复杂度O(Length(h1)+Length(h2)),但需要附加O(Length(h1))的存储空间,以存储hash表。

    解法三: 转化为另一已知问题

       由于两个链表都没有环,我们可以吧第二个链表接在第一个链表后面,如果得到的链表有环,则说明这两个链表相交。否则,这两个链表不相交。因此原问题就转化成判断一个链表是否有环。    注: 在这里如果有环,则第二个链表的表头一定在环上,因此只需从第二个链表开始遍历,看是否会回到起始点就可以判断出来。   最后别忘了恢复原来的状态,去掉从第一个链表到第二个链表表头的指向。

      评价:   这方法总的时间复杂度也是线性的,且只需要常数的空间。

    解法四:   抓住要点

    仔细观察不难发现:如果没有环的两个链表相交于某一节点,那么在这个节点之后的所有节点都是两个链表所共有的。(利用这个特点简化解法):如果他们相交,则最后一个节点一定是共有的。

          具体思路:

     先遍历第一个链表,记住最后一个节点。然后遍历第二个链表,到最后一个节点时和第一个链表的最后一个节点做比较,如果相同,则相交,否则,不相交。

    时间复杂度O(Length(h1)+Length(h2)),而且只用了一个额外的指针来存储最后一个节点。

  • 相关阅读:
    Unity Animation扩展方法总结
    Unity 离线建造系统
    Unity 任意区域截屏创建Sprite
    Unity ugui拖动控件(地图模式与物件模式)
    Unity 极简UI框架
    Unity 芯片拼图算法
    Unity Procedural Level Generator 基础总结与功能优化
    MANIFEST.MF是个什么?
    外包程序员怎么办?
    文件上传transferTo一行代码的bug
  • 原文地址:https://www.cnblogs.com/zdblog/p/3666717.html
Copyright © 2011-2022 走看看