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))