微软亚院之编程判断俩个链表是否相交
给出俩个单向链表的头指针,比如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作为终点,然后利用第三问得出结果