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)