题目:给出两个单向链表的头指针,比如h1,h2,判断这两个链表是否相交。(均不带环)
解法一:先判断第一个链表的每个节点是否在第二个链表中。复杂度O(Length(h1)*Length(h2)),显然不可以。
解法二:利用计数的方法。如何,两个链表相交的话,记他们含有相同的节点,相同的节点就有相同的地址,一个简单的方法是对第一个链表的节点地址进行hash排序,简历hash表,然后针对第二个标的每一个节点的地址查询hash表,如果他在hash表中出现,那么说明第二个链表和第一个链表有共同的节点。时间复杂度O(Length(h1)+Length(h2)),时间复杂度还不错,但增加了O(Length(h1))的空间复杂度。
解法三:转化为另一已知问题。由于没有环,所以我们把两个链表连在一起,把h2的表头接在h1的表尾,如果h1,与h2有交点的话,必然形成环,而h2的头结点一定在环里,只要从h2的开头开始,一次遍历,如果回到h2,则两个链表相交。当然,个人认为这个方法虽然复杂度低了,但是不好,因为它不能让我们得知哪些是交点。
解法四:抓住要点。如果两个链表相交,那么从第一个相交的点之后,两个链表的之后节点都相同。即最后一个节点是相同的,那么解决办法是先遍历第一个链表,记住最后一个节点,其次遍历第二个链表到最后一个链表,看是最后两个节点是否相同。编程之美上说这个方法比解法三更胜一筹,不过相比之下,还是更喜欢方法三。
扩展问题(没有去参考别人的解法,仅是个人想到就怎么写的,欢迎一起交流):1.如果链表可能有环呢?可以用方法2。2.如果我们必须求出两个链表相交的第一个节点呢。
来源:https://www.cnblogs.com/sou78/p/3338072.html