由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 关于单链表找环的问题。
相关主题
怎么返回单链表里面的环的前一个节点的位置?怎样除去循环链
再上一简单点面试题了请问大牛们Leetcode Reorder List 中找中间节点怎么能现场想清楚?多谢!
问一道常见面试题,reverse a linked listBloomberg面经(onsite)
微软onsite有behaviral 问题吗贡献几道当年google面试题
讨论 找单链表倒数m的节点金融公司的online test是选Java还是选C好?
链表中每三个数逆转的题?java没有指针真麻烦
请教狗狗题:复制带随机指针的链表问几道算法题
关于找环的那道题目G家电面被拒,请帮助分析原因
相关话题的讨论汇总
话题: slow话题: fast话题: ceil话题: 步长话题: next
进入JobHunting版参与讨论
1 (共1页)
r****o
发帖数: 1950
1
通常的做法是设一快一慢两个指针,fast和slow,步长分别为2和1。这样可以在O(n)的
时间内确定是否存在环。
但是如果这个fast和slow指针的步长为其他值,比如说3和1,或者4和3,是否仍然可以
确定环?如果可以的话,所用时间是否仍为O(n)?
r****o
发帖数: 1950
2
我的想法是4和3的情况与2和1一样,都能在O(n)的时间内确定存在环。
但3和1的情况,能不能确定存在环呢?如果能,复杂度是多少?
欢迎各位多指点。

【在 r****o 的大作中提到】
: 通常的做法是设一快一慢两个指针,fast和slow,步长分别为2和1。这样可以在O(n)的
: 时间内确定是否存在环。
: 但是如果这个fast和slow指针的步长为其他值,比如说3和1,或者4和3,是否仍然可以
: 确定环?如果可以的话,所用时间是否仍为O(n)?

r****o
发帖数: 1950
3
2和1的情况要判断fast==slow || fast->next==slow
是不是3和1的情况判断fast==slow || fast->next==slow || fast->next->next==slow
就可以了?
是不是k和1的情况判断fast==slow || fast->next==slow || ... || fast->.....>
next==slow (共k-1个next) 就可以? 不过这个复杂度就是O(nk)了吧。

【在 r****o 的大作中提到】
: 我的想法是4和3的情况与2和1一样,都能在O(n)的时间内确定存在环。
: 但3和1的情况,能不能确定存在环呢?如果能,复杂度是多少?
: 欢迎各位多指点。

a**********k
发帖数: 1953
4
From number theory point of view, any number p(fast)
and q (slow) would work as long as GCD(p, q) = 1.
r****o
发帖数: 1950
5
多谢,能解释一下吗?

【在 a**********k 的大作中提到】
: From number theory point of view, any number p(fast)
: and q (slow) would work as long as GCD(p, q) = 1.

d**e
发帖数: 6098
6
我不懂数论,但如果以纯数学计算来算,不知这样对不对
速度分别是 f 和 s, f > s
环之前的长度为 k, 环长为 m,如果经过时间 t ,两者相遇,则
(f t - k)%m = (s t - k)%m
写成 (f t - k) - m a = (s t - k) - m b
==> t = m(a - b)/(f - t)
而需要 t 取得最小,且因为一定在环里面相遇,所以 t > k
那应该是 m(a - b)/(f - t) > k
那就是说,给定 m, f, t,(a - b) > (k/m) * (f - t)
由于 t, m, (f-t)都是整数,(a-b)也是整数,而且整除(f-t)
所以 (a-b) = ceil[(k/m)] * (f-t)
所以 t = m * ceil (k/m)
1) 如果 k < m,好简单 t = m < n
2) 如果 k > m, m * c + d = n, d < m
t = m * ceil[(n - m)/m] = m * ceil[c + d/m - 1] = m * c < n
不知中途有没算错,如果这样成立,感觉

【在 r****o 的大作中提到】
: 多谢,能解释一下吗?
h**6
发帖数: 4160
7
错了,是环长len与fast-slow满足
GCD(len, fast-slow) = 1

【在 a**********k 的大作中提到】
: From number theory point of view, any number p(fast)
: and q (slow) would work as long as GCD(p, q) = 1.

m*****g
发帖数: 226
8
这个你试几个例子就知道了
如果3:1或者更大的话,快的那个可能要兜几个圈子才正好碰到慢的
r****o
发帖数: 1950
9
我现在还不是很确定,是不是3:1对各种情形的带环链表都确定能保证两个指针相遇呢?

【在 m*****g 的大作中提到】
: 这个你试几个例子就知道了
: 如果3:1或者更大的话,快的那个可能要兜几个圈子才正好碰到慢的

r****o
发帖数: 1950
10
感觉好像有道理。能不能解释一下呢?

【在 h**6 的大作中提到】
: 错了,是环长len与fast-slow满足
: GCD(len, fast-slow) = 1

h**6
发帖数: 4160
11
把步长为1的指针视为静止的参照物,步长为3的指针相当于步长为2。
如果环长为偶数,步长为2的指针可能永远也不会碰上静止的指针。
g**********1
发帖数: 1113
12
this depends on implementation. If you cmp all the all the nexts in one step
of fast with the corresponding step of the slow one. One circle is enough.
But if you only cmp the last next of the fast with the slow one, you will
miss the slow one in one circle.

【在 m*****g 的大作中提到】
: 这个你试几个例子就知道了
: 如果3:1或者更大的话,快的那个可能要兜几个圈子才正好碰到慢的

d**e
发帖数: 6098
13
这个不对吧,为什么不会碰上呢?事实上如果按你这个例子,步长1的指针会经过所有
的点,包括步长2经过的点。
举个例子,环长为6,环之前为3,两个指针分别是 1, 3,大家都由环的起点开始进入环
时间t=3时,步长1刚好进入环的起点,而步长3就已经绕了环一圈回到环的起点,碰上了
ps:谁可以看看我前面的证明对不对?

【在 h**6 的大作中提到】
: 把步长为1的指针视为静止的参照物,步长为3的指针相当于步长为2。
: 如果环长为偶数,步长为2的指针可能永远也不会碰上静止的指针。

r****o
发帖数: 1950
14
是不是说k:1的话,每次比较k次,也能保证one circle enough?

step
.

【在 g**********1 的大作中提到】
: this depends on implementation. If you cmp all the all the nexts in one step
: of fast with the corresponding step of the slow one. One circle is enough.
: But if you only cmp the last next of the fast with the slow one, you will
: miss the slow one in one circle.

1 (共1页)
进入JobHunting版参与讨论
相关主题
G家电面被拒,请帮助分析原因讨论 找单链表倒数m的节点
有没有觉得这个面试问题有点膈应?链表中每三个数逆转的题?
感觉leetcode上的题请教狗狗题:复制带随机指针的链表
G家,请问这样的面试表现拿到offer的几率如何?关于找环的那道题目
怎么返回单链表里面的环的前一个节点的位置?怎样除去循环链
再上一简单点面试题了请问大牛们Leetcode Reorder List 中找中间节点怎么能现场想清楚?多谢!
问一道常见面试题,reverse a linked listBloomberg面经(onsite)
微软onsite有behaviral 问题吗贡献几道当年google面试题
相关话题的讨论汇总
话题: slow话题: fast话题: ceil话题: 步长话题: next