投了腾讯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).