链表交集面试问题

该算法的思想是设置两个指针p,

q,其中p一次向前移动一步,q一次向前移动两步。那么如果单链表中有环,P和Q相遇;否则q会先遇到null。

这里主要理解一个问题,就是为什么单个链表中有环的时候P和Q会相交?

假设单链表的长度为n,单链表是循环的,那么在第I次迭代中,P指向元素I。

现代的

n和q指向2i。

现代的

n .所以当我≡2i(mod

n),p和q相遇。而i≡2i(mod

n)

= & gt

(2i

-

我)

现代的

n

=

= & gt

现代的

n

=

= & gt

当i=n时,P和Q相遇。这里简单的理解就是P和Q同时在操场上跑步,其中Q的速度是P的两倍,当两者同时起跑时,P跑一次到达起点,而Q就是现在。

好了,跑完两圈,到起点。

那么当p和q的起点不同时呢?假设p在第I次迭代时指向元素I。

现代的

n和q指向k+2i。

现代的

n,其中0

n)

= & gt

(i+k)

现代的

n

=

= & gt

当i=n-k时,P和Q相遇。

解决方案:

促销:

1.

如果两只手的速度不一样,比如p,q,(

0 & ltp & ltq)两者满足什么样的关系,才能绝对交给一个节点?

警司(一)

=

圆周率

平方(一)

=

k

+

如果两个在一个节点相交,那么

警司(一)

=

平方(一)

= & gt

(圆周率)

现代的

n

=

k+

)

现代的

n

= & gt[

(问

-p)我

+

k

]

现代的

n

=0

= & gt

(q-p)i

+

k

=

神经网络

[N]

是自然数]

= & gt

=

(Nn

-k)

/(p-q)

我取一个自然数,然后什么时候

p和q满足上面的等式。

也就是

有一个自然数n,可以满足Nn。

-k

p

-

q

的倍数,确保两者的交集。

特殊情况:如果问

是p。

步长的两倍,两者从相同的起点开始,即,

q

=

2p

,

k

=0,

那么等式就变成了:

Nn=i:

也就是可以理解为,当I是第I次迭代的圆的整数倍时,两者可以相交,交点就是起点。

2.如何判断单个链表的长度?

这个比较简单,知道q

已经进入擂台,保住了位置。然后遍历这个位置,当再次遇到q时。

位置就够了,迭代次数就是环的长度。

3.

如何在环中找到链表的第一个节点?

假设链表的长度为L,前半部分的长度为k-1,那么第一个环中的节点为K,环的长度为

n,

那么当q=2p时,

你们第一次见面是什么时候?当Q指针到第k个节点时,Q指针已经在环的第一个。

k

现代的

n

的位置。p和q

相距k个元素,从不同的起点出发,交点位置为

氮钾

从图中可以明显看出,当P从交叉点(n-k)的位置移动时

向前遍历k个节点,到达环的第一个点,节点k。

算法很简单:

p和q的指针

从(n-k)中第一个交点的位置开始,另一个指针从链表的头开始遍历,它的交点就是环中链表的第一个交点。

4.

如果判断两个单链表有交叉?第一个路口在哪里?

这个问题画个图,很容易转化到前面的题目。

如果其中一个链表中的尾节点与头节点相连,就很容易发现问题转化为问题3,找到带环的链表中的第一个节点。