两个单向链表是否相交 汇总

投了腾讯IOS客户端开发岗,结果面试官大大问了一堆操作系统,数据结构,算法,计算机网络问题,orz,给大神跪了!最后问大神什么职位,大神说他就是IOS工程师。真服了!当时问了算法,关于链表,当时没想起来,面完之后拿个纸算算,我竟然会。写下来,mark一下。

 

问题:给出两个单向链表的头节点,判断两个链表是否相交,如果相交,请找出相交节点。

这个问题是分好几种情况的,要分支来判断:

假定两个单链表分别为链表A和链表B,则:

1.A无环,B无环,存在以下三种情况:

  (1). (2). (3).

2.A有环,B无环(A无环,B有环亦然),存在一种情况:

               

3.A有环,B有环,则存在三种情况:

  (1). (2). (3).

判断一个单向是否有环的方法:从该链表头指针开始,设置两个指针,一个快指针,一个慢指针。快指针每次沿着链表走两个链节,慢指针每次沿着链表走一个链节,当两个指针指向同一个链节时(即两个指针相等),说明链表有环;当快指针指向null时,说明链表无环。

对于情况1:

    分别遍历得到两个链表的长度,并且在遍历的时候,比较两个链表的终节点,如果不同,则是(2);如果相同,则为(1)或(3).

    对(1)(3),取链表节点数的差值,将长链表从差值处开始遍历,短节点从头结点开始遍历,比较两个节点是否相等,不相等继续向下遍历,直至相等找到相交节点。

对于情况2:

    直接得出结论,二者不相交。

对于情况3:

    判断A有环的因为快慢指针指向了同一个节点,记为交点A,B的记为交点B。从交点A放出一个慢指针,每次沿链表走一个链节;交点B放出一个快指针,每次沿着链表走

    两个链节。当两个指针相交,则说明A、B共用一个环,情形为(2)或(3);当A的慢指针走回交点A,两个指针仍然没相交,说明情况为(1).

    对(2)(3),将交点A的next指向null,断开环路然后按照1(3)中的线性查找方法去找相交节点,一定能找到一个交点C。

    我们将交点A的next复原,从交点C开始遍历,找到交点C的前节点,让交点C前节点的next指向null,这个时候能够找到交点D。当交点C与交点D相同时,为情况(2);不

    相等时为情况(3).

转载于:https://www.cnblogs.com/cwkpql/p/4743602.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值