Я не думаю, что мое решение - O (n), но оно очень короткое и может быть интересным для людей, которые не ограничены сложностью (поскольку этот ответ является одним из первых результатов поиска для "Ocaml intersect list «)
Эта функция возвращает true, если пересечение не пустое. Другими словами, он проверяет, имеют ли два списка общие элементы, если да, true, иначе false.
let intersect l1 l2 =
List.fold_left (fun acc x -> if (List.exists (fun y -> y = x) l1) then true else acc) false l2;;
Очень похоже, что эта функция возвращает фактическое пересечение.
let intersect l1 l2 =
List.fold_left (fun acc x -> if (List.exists (fun y -> y = x) l1) then x::acc else acc) [] l2;;
Не стесняйтесь поправлять меня, если мой солутон неверен. Это должен быть полиморф, поскольку x и y могут быть любыми типами, которые можно сравнивать.