optimize merge()