判断链表是否相交

首先,判断单个链表是否含有环:

  设置两个指针,一个慢步长为1,一个快步长为b,如果两个指针在某一位置重合,则有环,否则无环,类似于俩人在操场上跑圈。这只是一个宏观思路,具体怎么用计算机思维实现,自定。

然后,分情况讨论:

情况一:两条单链表均无环

     最简单的一种情况,由于两条链表如果交叉,他们的尾节点必然相等(Y字归并),所以只需要判断他们的尾节点是否相等即可。

情况二:两条单链表均有环

    这种情况只需要拆开一条环路(注意需要保存被设置成null的节点),然后判断另一个单链表是否仍然存在环路,如果存在,说明无交叉,反之,则有交叉的情况。

情况三:两条单链表,一条有环路,一条无环路

    这种情况显然他们是不可能有交叉的。

扩展问题

1)  交叉链表,如何找到交叉点?
设较长链表为head1,两指针p1和p2分别对链表head1和head2从头遍历,步长均为1,让p1先移动nLen1 - nLen2步,再让p1和p2同时移动,则p1与p2相遇处即为交叉点处。

2)  单链表,如果有环,长度是多少?  如果有环,环的起点位置? 参见 http://www.cnblogs.com/xudong-bupt/p/3667729.html

原文地址:https://www.cnblogs.com/zhaoyl/p/2476846.html