zoukankan      html  css  js  c++  java
  • 算法题006 判断两个链表是否相交

    编程判断两个单向链表是否相交

     

    题目来源

      《编程之美》3.6节。

      给出两个单向链表的头指针,判断这两个链表是否相交。假设两个链表都不带环。

     

    分析

      这个题目需要得出的结论是两个链表是否相交,即返回值应当是一个布尔值。

      因为如果出现两个链表相交的情况,一旦程序释放了其中一个链表的所有节点,会造成信息丢失,另一个与之相交的节点也会受到影响。

     

    解法一:直观的想法

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

     

    解法二:利用hash表

      两个链表相交,就会有共同的节点,而节点地址又是节点的唯一标识。

      所以,如果我们能够判断两个链表中是否存在地址一致的节点,就可以知道这两个链表是否相交。

      一个简单的做法是对第一个链表中的节点地址进行hash排序,建立hash表,然后针对第二个链表的每个节点的地址查询hash表,如果它在hash表中出现,那么说明第二个链表和第一个链表有共同的节点。

      这个方法的时间复杂度为O(Length(h1) * Length(h2)),但是它同时要附加O(Length(h1))的存储空间。是以空间换时间的做法。

     

    解法三:转化为链表有环问题

      由于两个链表都没有环,我们可以把第二个链表接在第一个链表的尾部,如果得到的链表有环,则说明这两个链表相交。

      这样,我们就把问题转化成了判断一个链表是否有环,这里需要注意的是,如果有环,那么第二个链表的表头一定在环上,我们只需要从第二个链表开始遍历,看是否会回到起始点就可以判断出来。

      最后,别忘了恢复原来的状态,去掉从第一个链表到第二个链表表头的指向。

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

    解法四:抓住要点

      如果两个没有环的链表相交于某一节点,那么在这个节点之后的所有节点都是两个链表所共有的。

      根据这个特点,我们可以知道,如果两个链表相交,则最后一个节点一定是共有的。

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

    参考资料

      《编程之美》

  • 相关阅读:
    Running APP 使用说明
    Android 控件八 WebView 控件
    Android 控件七 ImageView 控件
    Android 控件六 CheckBox 控件
    Android 控件五 RadioButton 控件
    Android 控件四 EditText 控件
    Android 控件三 TextView 控件实现 Button
    Android 控件二 Button
    Android 基础控件演示实例
    Android 控件一 TextView
  • 原文地址:https://www.cnblogs.com/mengdd/p/2958642.html
Copyright © 2011-2022 走看看