给出两个单行链表的头指针 判断这两个链表是否相交 为了简化 这里假设两个链表均不带环
方法1:
判断第一个链表的每个节点是否在第二个链表中 这种方法的时间复杂度为O(lenth(l1)*lenth(l2))
方法2:
如果两个链表相交 那么这两个链表就会有共同的节点 而节点地址又是节点的唯一标识 所以我们能够判断两个链表是否有存在地址一致的节点 就可以判断两个链表是否相交
可以对第一个链表的节点地址进行hash排序 建立hash表 然后对第二个链表的每个节点的地址查询hash表 如果hash表中有出现该地址 那么说明有共同节点
算法时间复杂度为O(max(lenth(l1)+lenth(l2))) 空间复杂度为O(lenth(l1))
方法3:
两个链表都是没有环的 我们可以把第二个链表接在第一个链表的后面 如果得到的链表有环则说明相交
判断是否有环 可以用快慢指针 我们可以从第二个链表的头指针进行遍历
方法4:
如果两个链表相交 则说明这个相交的节点之后所有的节点都是两个链表所共有(指针指向唯一一个地址)那么可以先遍历第一个链表 记住最后一个节点 然后遍历第二个链表 到最后一个节点时 和第一个链表的最后一个节点比较是否相同 如果相同这说明相交
时间复杂度为O(max(lenth(l1)+lenth(l2)) 空间复杂度只用了一个临时指针存储链表1的最后一个指针
求两个链表的第一个公共结点:
如果两个链表有公共结点 那么公共结点出现在两个链表的尾部 如果从两个 链表的尾部开始往前比较最后一个相同的节点就是相交的节点 但是
在单向链表中只能从头结点开始顺序遍历 最后才能达到尾结点 最后的尾结点却要被最先比较 因此可以利用栈的特性 :分别把两个链表的节点放入两个栈里 这样两个链表
的尾结点就位于栈顶 接下来比较栈顶的节点是否相同 如果不相同 则把栈顶弹出接着比较下一个栈 直到找到最后一个相同的节点
如果两个链表的长度为别为m.n 那么空间复杂度和时间复杂度都为O(m+n)
这种方法需要借助两个辅助栈
避开使用辅助栈的方法 可以先遍历两个链表得到它们的长度 就能知道哪个链表比较长 以及长的链表比短的多几个结点
在第二次遍历时 在较长的链表上先走上若干步 接着再同时再两个链表上遍历 找到第一个相同的节点就是第一个公共结点
这种方法的时间复杂度为O(M+N) 空间复杂度为一个常量