Si vos listes ne contient que des nombres entiers d'une taille limitée, il y a aussi une solution en O (n):
1.) Créer un tableau de booléens de la taille de y ou la plus grande valeur entière plus 1 dans vos listes d'origine (p. dans votre exemple '9 + 1'); définissez tous les champs sur false;
let m = Array.create 10 false
->[|false; false; false; false; false; false; false; false; false; false|]
2.) itérer sur la première liste: Pour chaque élément que vous rencontrez, définissez le booléen avec le décalage 'vrai' respectif; dans votre exemple, cela donnerait
List.iter (fun x -> m.(x) <- true) e1
->[|false; false; false; true; true; true; true; true; false; false|]
3.) filtre sur la deuxième liste, en ne gardant que les éléments dont le champ correspondant dans le tableau est vrai
List.filter (fun x -> m.(x) = true) e2
->[3; 5; 7]
OCaml n'ont mis Oper ation: http://caml.inria.fr/pub/docs/manual-ocaml/libref/Set.S.html Notez que les solutions bot sont équivalentes en terme de complexité (avec ocaml set). –