let merge hs1 hs2 =
    let cmp h1 h2 = Datatype.Int.compare h1#id h2#id in
    let norm hs = List.sort cmp (List.filter (fun h -> h#alive) hs) in
    let rec do_merge hs1 hs2 =
      match hs1 , hs2 with
        | h1::hst1 , h2 :: hst2 ->
            let k1 = h1#id in
            let k2 = h2#id in
            if k1 < k2 then h1 :: do_merge hst1 hs2 else
              if k1 > k2 then h2 :: do_merge hs1 hst2 else
                h1 :: do_merge hst1 hst2
        | hs , [] | [] , hs -> hs
    in do_merge (norm hs1) (norm hs2)