问题描述:给出两个单向链表的头指针(h1,h2),判断这两个链表是否相交。假设两个链表均不带环。
解法一:直观的想法
判断第一个链表胡每一个节点是否在第二个链表中。
时间复杂度为O(Length(h1)*Length(h2))。
解法二:利用计数的方法
如果两个链表相交,就会有共同的节点。我们可以把第一个链表的节点地址进行hash排序,建立Hash表,然后针对第二个链表的每个节点的地址查询Hash表,如果在表中出现,就说明交点出现。
解法三:转化为另一已知问题
把第二个链表接到第一个链表后面,如果得到的链表有环,则说明这两个链表相交。这样就把问题转化为判断一个链表是否有环。
而判断一个链表是否有环,只需进行遍历看是否会回到起始点就可以判断出来。
解法四:抓住要点
因为“如果两个无环的链表相交与某一节点,那么在这个节点之后的所有节点都是两个链表共有的”。那么可以先遍历第一个链表,记住最后一个节点,然后遍历第二个链表,到最后一个节点时和第一个链表的最后一个节点做比较,若相同,则相交,否则,不相交。
扩展问题:
1.若链表有环呢?如何判断?
2.如何求相交的第一个节点?