链表交集面试问题
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,找到带环的链表中的第一个节点。