No7、(链表)

微软亚院之编程判断俩个链表是否相交
给出俩个单向链表的头指针,比如h1,h2,判断这俩个链表是否相交。
为了简化问题,我们假设俩个链表均不带环。
问题扩展:
1.如果链表可能有环列?
2.如果需要求出俩个链表相交的第一个节点列?

 

第一问:假设两个链表不带环,给出两个单向链表的头指针,判断两个链表是否相交

1、两个头指针都遍历至最后一个节点,如果两个节点相同,那么两个链表相交;否则不相交。

2、h1遍历得到该链表的长度L1,h2遍历得到该链表的长度L2,假设L1>L2,h1先向前走(L1-L2)步,h2还是从头开始;然后两个指针步调一致向前走,如果在某一步两个节点相同,那么相交;否则不相交。

 

第二问:如果两个可能有环列的链表,如何判断他们是否相交

我们需要首先判断一个链表中是否存在环,将两个指针b1,b2同时指向链表的头结点,一个指针每次前进两个节点,另一个指针每次前进一个节点,如果两个节点在为空之前相遇,那么这个链表中含有环,相遇的点肯定是在环上。

两个节点,有三种情况,两个链表都没有环,两个链表都有环,一个链表有环一个链表没环

第一种情况,就是第一问;

第二种情况,假设判断链表h1的时候出现了环,b1和b2相交的节点p肯定在环上...从h2开始遍历该链表,如果出现了节点p,那么两个链表相交。OK,问题出来了,如果两个链表都有环,但是不相交,当我们遍历h2的时候是个无限循环,所以上述方法还是有缺陷。所以我认为,需要判断h1和h2是否都有环,在判断过程中就能获得两个节点p1、p2,p1在h1链表的环上,p2在h2链表的环上。把不重复到达p2作为循环条件,从p2开始遍历该链表的环,如果p1出现在环上,那么相交;否则不相交

第三种情况:肯定不相交..

所以最终答案应该是:

首先判断两个链表都有环,

如果都没环,第一问;

如果一个有一个没有,不相交;

如果都有环,那么通过判断是否有环的方法可以分别获得两个链表环上的点。然后判断一个点是否在另一个节点的环上。

 

第三问:假设两个链表不带环,给出两个单向链表的头指针,两个链表相交,求相交的第一个点...

遍历两个链表,获得其长度,假设为Len1和Len2且Len1>Len2,那么p1先走Len1-Len2步,然后一起走,直到相交的第一个点就是两个链表相交的第一个点..


第四问:假设两个链表都带环,给出两个单向链表的头指针,两个链表相交,求相交的第一个点..

两种情况:第一种情况相交的第一个点在环上;第二种情况相交的第一个点不在环上..

第一种情况类似于一个圆的两条切线。它们相交的第一点可以认为是任意一个链表进入环的第一点。。假如是h1,根据第二问我们可以获得h1链表环上的一点p,题目转化为求以h1和p为头指针的两个单向链表相交的第一点..即第三问

第二种情况类似于第三问,首先需要获得环上的一点作为终点...可以利用第二问取得环上的一点p作为终点,然后利用第三问得出结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值