zoukankan      html  css  js  c++  java
  • 数据结构和算法设计专题之---判断两个链表是否相交并找出交点 分类: Java 2014-07-30 16:45 574人阅读 评论(0) 收藏

    题目:

    一个比较经典的问题,判断两个链表是否相交,如果相交找出他们的交点。

    image


    首先来看一下如何判断两个链表是否存在相交的节点:

    思路:

    1、碰到这个问题,第一印象是采用hash来判断,将两个链表的节点进行hash,然后判断出节点,这种想法当然是可以的。

    2、当然采用暴力的方法也是可以的,遍历两个链表,在遍历的过程中进行比较,看节点是否相同。

    3、第三种思路是比较奇特的,在编程之美上看到的。先遍历第一个链表到他的尾部,然后将尾部的next指针指向第二个链表(尾部指针的next本来指向的是null)。这样两个链表就合成了一个链表,判断原来的两个链表是否相交也就转变成了判断新的链表是否有环的问题了:即判断单链表是否有环?

    这样进行转换后就可以从链表头部进行判断了,其实并不用。通过简单的了解我们就很容易知道,如果新链表是有环的,那么原来第二个链表的头部一定在环上。因此我们就可以从第二个链表的头部进行遍历的,从而减少了时间复杂度(减少的时间复杂度是第一个链表的长度)。

    下图是一个简单的演示:

    image

    这种方法可以判断两个链表是否相交,但不太容易找出他们的交点。

    4、仔细研究两个链表,如果他们相交的话,那么他们最后的一个节点一定是相同的,否则是不相交的。因此判断两个链表是否相交就很简单了,分别遍历到两个链表的尾部,然后判断他们是否相同,如果相同,则相交;否则不相交。示意图如下:

    image


    在来看一下如何找出第一个相交点:

    思路:

    1. 判断出两个链表相交后就是判断他们的交点了。假设第一个链表长度为len1,第二个问len2,然后找出长度较长的,让长度较长的链表指针向后移动|len1 - len2| (len1-len2的绝对值),然后在开始遍历两个链表,判断节点是否相同即可。

    2. 还有一种方案是,是在上面的问题中的解决方案3中将一个链表的尾节点链接到第二个链表的头结点,如果两个链表有共同的交点的话,一定存在环,那么这时候我们就可以找到环的入口节点,就是两个链表的相交的第一个节点。


    总结

    上面的几种方法中最后一种是比较不错的,当然hash也是可以的。

    问题的延伸:

    如果原来的两个链表中有环怎么处理?

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    软件设计和开发是手艺活也是艺术活
    学界老师和业界专业人员的紧密合作才能促进软件设计开发教学的进步
    最简单的 GitExtensions 教程(持续更新中)
    最简单的 IntelliJ IDEA 中使用 GitHub 进行版本控制教程(持续更新中)
    工作室成员 GitHub 地址集中贴(按发布时间先后排序)
    使用 Visual Studio Code 运行 C# 及 Java 程序
    推荐一个非常好的 IntelliJ IDEA 教程
    Commit message 和 Change log 编写指南(转自阮一峰的博客)
    关于编码规范的延伸资料(来自于福州大学陈世发同学的博客)
    【扩展阅读】提问的智慧(转自福州大学陈世发同学的评论)
  • 原文地址:https://www.cnblogs.com/pjdssswe/p/4696021.html
Copyright © 2011-2022 走看看