判断两个链表是否相交

给出两个单行链表的头指针 判断这两个链表是否相交 为了简化 这里假设两个链表均不带环


方法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) 空间复杂度为一个常量



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值