我怎样才能检查两个"指针"通过列表时相遇?

时间:2015-03-18 11:53:14

标签: ocaml

例如,我有一个列表[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;...]

因此,一次移动后,ab都会到达索引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吗?

1 个答案:

答案 0 :(得分:3)

绑定列表,并按身份(使用==)进行比较。

| ((_::_::xs) as a)), ((_::ys) as b) ->
  if a == b then ...
  else ...

请注意,如果您正在尝试确定列表是否与另一个列表共享尾部,则此方法是不够的(慢速指针可以在快速指针赶上它之前到达终点)。