现在的位置: 首页 > 综合 > 正文

判断链表是否相交

2011年11月28日 ⁄ 综合 ⁄ 共 708字 ⁄ 字号 评论关闭

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

  设置两个指针,一个慢步长为1,一个快步长为b,如果两个指针在某一位置重合,则有环,否则无环,类似于俩人在操场上跑圈。

然后,分情况讨论:

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

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

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

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

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

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

 

扩展:带环链表起始环节点在哪?(见文末图示)

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

2)  环长是多少?假如当前相遇在S点,则步长为b的指针不动,步长为1的指针继续以步长1走,记录走的步数,当二者再相遇时,(步数K*1)为环长L。关于必然相遇的证明,如果你觉得此方法过于投机,不太直观,可以作非形式化描述如下,b已知,并假设已经求出L,

    (b-1)*K=N*L,显然,n圈之后,一定会相遇。因为一定存在L和N,使得(b-1)*K=N*L。

3)  环的第一个节点是?环的第一个节点见图中H点,新的两个指针 i,j 重新指向表头,循环:

    i 每走一步,j在其基础上后挪L步;

    直到第一个指针指向的位置与第二指针重合;

    则当前位置为环的起始节点!

抱歉!评论已关闭.