def coupe(lst): """sépare une liste en deux listes ayant le même nombre d'éléménts, à un près""" l1, l2 = None, None while lst is not None: l1, l2 = Cellule(lst.valeur, l2), l1 lst = lst.suivante return l1, l2 def fusion(l1, l2): """fusionne deux listes triées""" if l1 is None: return l2 if l2 is None: return l1 if l1.valeur <= l2.valeur: return Cellule(l1.valeur, fusion(l1.suivante, l2)) else: return Cellule(l2.valeur, fusion(l1, l2.suivante)) def tri_fusion(lst): """trie une liste avec le tri fusion""" if lst is None or lst.suivante is None: return lst l1, l2 = coupe(lst) return fusion(tri_fusion(l1), tri_fusion(l2))