美文网首页经典面试题程序员笔试&&面试经验
经典面试题17 - 搜索编程判断两个链表是否相交

经典面试题17 - 搜索编程判断两个链表是否相交

作者: 豆志昂扬 | 来源:发表于2017-04-09 17:41 被阅读231次

问题
给出两个单向链表的头指针(如下图所示),


比如h1、h2,判断这两个链表是否相交。这里为了简化问题,我们假设两个链表均不带环。

解答

  • 直接循环判断第一个链表的每个节点是否在第二个链表中。但这种方法的时间复杂度为O(Length(h1) * Length(h2))。显然,我们得找到一种更为有效的方法,至少不能是O(N^2)的复杂度。

  • 针对第一个链表直接构造hash表,然后查询hash表,判断第二个链表的每个节点是否在hash表出现,如果所有的第二个链表的节点都能在hash表中找到,即说明第二个链表与第一个链表有相同的节点。时间复杂度为为线性:O(Length(h1) + Length(h2)),同时为了存储第一个链表的所有节点,空间复杂度为O(Length(h1))。

  • 转换为环的问题。把第二个链表接在第一个链表后面,如果得到的链表有环,则说明两个链表相交。如何判断有环的问题上面已经讨论过了,但这里有更简单的方法。因为如果有环,则第二个链表的表头一定也在环上,即第二个链表会构成一个循环链表,我们只需要遍历第二个链表,看是否会回到起始点就可以判断出来。这个方法的时间复杂度是线性的,空间是常数。

  • 进一步考虑“如果两个没有环的链表相交于某一节点,那么在这个节点之后的所有节点都是两个链表共有的”这个特点,我们可以知道,如果它们相交,则最后一个节点一定是共有的。而我们很容易能得到链表的最后一个节点,所以这成了我们简化解法的一个主要突破口。那么,我们只要判断两个链表的尾指针是否相等。相等,则链表相交;否则,链表不相交。
    所以,先遍历第一个链表,记住最后一个节点。然后遍历第二个链表,到最后一个节点时和第一个链表的最后一个节点做比较,如果相同,则相交,否则,不相交。这样我们就得到了一个时间复杂度,它为O((Length(h1) + Length(h2)),而且只用了一个额外的指针来存储最后一个节点。这个方法时间复杂度为线性O(N),空间复杂度为O(1),显然比解法三更胜一筹。

/判断两个链表是否相交
bool isIntersect(Node *h1,Node *h2)
{
  //异常判断
    if(h1 == NULL || h2 == NULL) return false;    
    while(h1->next != NULL) {
        h1 = h1->next;
    }
    while(h2->next != NULL) {
        h2 = h2->next;
    }
    //尾节点是否相同
    if(h1 == h2) return true;        
    else return false;
}

更多阅读
经典面试100题 - 持续更新中

相关文章

  • 经典面试题17 - 搜索编程判断两个链表是否相交

    问题:给出两个单向链表的头指针(如下图所示), 解答 直接循环判断第一个链表的每个节点是否在第二个链表中。但这种方...

  • 链表相交的问题(java)

    判断两个无环链表是否相交首先我们要知道相交是什么概念两个链表相交.png现在大家都知道了,两个链表相交,则两个链表...

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

    给出两个单向链表的头指针,而两个链表都可能带环,判断这两个链表是否相交,并且给出他们相交的第一个节点 参考 1)判...

  • 编程之美-判断两个链表是否相交 (涵其扩展问题)

    问题定义 两个单向链表的头指针,两个链表都可能带环1: 判断这两个链表是否相交2: 如果相交,给出他们相交的第一个...

  • 链表--链表相交 leetcode面试题 02.07

    题目 给定两个链表,判断两个链表是否相交,如果相交返回相交的交点,否则返回空结点。 思路 暴破法采用双循环,从第一...

  • 链表小题目

    如何判断两条单向链表是否相交,以及相交节点 同时遍历两个链表,求出长度差,然后长的链表走完 N次以后,短链表再开始...

  • 单链表相交判断

    给定两个单链表的头节点head1和head2,如何判断两个链表是否相交?相交的话返回true,不想交的话返回fal...

  • 有环单链表相交判断

    如何判断两个有环单链表是否相交?相交的话返回true,不想交的话返回false。如果两个链表长度分别为N和M,请做...

  • 判断两个单链表是否相交及找到第一个交点

    题目:给两个单链表,如何判断两个单链表是否相交?若相交,则找出第一个相交的节点。这道题的思路和解法有很多,在这把这...

  • 有环单链表相交判断练习题

    题目 如何判断两个有环单链表是否相交?相交的话返回第一个相交的节点,不想交的话返回空。如果两个链表长度分别为N和M...

网友评论

    本文标题:经典面试题17 - 搜索编程判断两个链表是否相交

    本文链接:https://www.haomeiwen.com/subject/czgdattx.html