例如,我有一个列表[1; 2; 1; 3; 2; 4; 1; 5; 6; 8;...]
。该列表包含重复的元素。
然后我们通过两个虚拟指针浏览列表。
一个指针a
从头开始,速度为2
。
另一个指针b
来自列表中间的某个位置,速度为1
。
那么如何检查a
是否与b
会面?
例如:
a
从[1; 2; 1; 3; 2; 4; 1; 5; 6; 8;...]
b
从索引1
开始,即[2; 1; 3; 2; 4; 1; 5; 6; 8;...]
因此,一次移动后,a
和b
都会到达索引2
,然后他们会见。
如何检查元素是否满足,没有索引信息?
我们可以比较两个元素的值,因为里面可能有重复。
在代码方面:
let l = [1; 2; 1; 3; 2; 4; 1; 5; 6; 8;...]
let find_middle_start l n =
let rec aux i = function
| [] -> []
| _::tl when i >= n -> tl
| _::tl -> aux (i+1) tl
in
aux 0 l
let parallel_travel l =
Random.self_init();
let b_start = find_middle_start l (Random.int (List.length l)) in
let rec go = function
| [], _::_ | _::_, [] | _::[], _::_ -> print_endline "Never meet"
| x::x1::xs, y::ys ->
if check_meet x y then print_endline "Meet"
else go xs ys
in
go l b_start
如何实施check_meet
?我不能正确x == y
吗?
答案 0 :(得分:3)
绑定列表,并按身份(使用==
)进行比较。
| ((_::_::xs) as a)), ((_::ys) as b) ->
if a == b then ...
else ...
请注意,如果您正在尝试确定列表是否与另一个列表共享尾部,则此方法是不够的(慢速指针可以在快速指针赶上它之前到达终点)。