On ajoute une cellule dans laquelle on mémorise les branches gauches et droites.
module L =
  struct
    class ['a] nil = ['a] Liste1.nil
    class ['a] cons = ['a] Liste1.cons
    class ['a] append l r =
      object (self : 'mytype)
        val left = (l : 'mytype)
        val right = (r : 'mytype)
        method null = left # null && right # null
        method hd =
          if left # null then right # hd
          else (left # hd : 'a)
        method tl =
          if left # null then right # tl
          else if left # tl # null then right
          else {< left = left # tl >}
        method length = left # length + right # length          
      end
  end;;
La difficulté est la méthode tl de la classe append. Elle utilise la copie fonctionnelle left = left # tl > qui crée un nouvel objet identique à self sauf dans lequel la branche gauche ("left") est remplacée par sa queue (left # tl).

Un petit test (on utilise les infixes pour que la notation soit plus lisible)
let ($) = new L.cons and (@) = new L.append in
  let l = (1 $ (2 $ new L.nil)) @ (3 $ (4 $ new L.nil)) in
  l # length;;
 - : int = 4