Maison > développement back-end > Golang > Fusionner les listes triées

Fusionner les listes triées

WBOY
Libérer: 2024-07-18 13:26:18
original
1113 Les gens l'ont consulté

Merge orted lists

Aujourd'hui, nous examinons une autre tâche de liste chaînée.

Créez une fonction pour fusionner 2 listes chaînées triées. La liste résultante doit être une liste triée en utilisant les nœuds des 2 listes.

Pour cela, nous utiliserons l'implémentation de liste chaînée générique du post précédent qui peut être trouvée ici

func mergeSortedLists(ll1 LinkedList[int], ll2 LinkedList[int]) LinkedList[int] {
    result := LinkedList[int]{}

    p1 := ll1.Head
    p2 := ll2.Head
    rp := &Node[int]{} // dummy node as result head
    result.Head = rp
    for p1 != nil && p2 != nil {
        if p1.Data >= p2.Data {
            rp.Next = p2
            p2 = p2.Next
        } else {
            rp.Next = p1
            p1 = p1.Next
        }
        rp = rp.Next
    }
    if p1 != nil {
        rp.Next = p1
    }
    if p2 != nil {
        rp.Next = p2
    }
    result.Head = result.Head.Next
    return result
}
Copier après la connexion

La logique est assez facile à suivre. Tout d’abord, nous configurons des pointeurs vers les têtes des 2 listes et la liste résultante. Puisque nous ne connaissons pas la « tête » de la liste résultante, nous créons un nœud factice comme espace réservé (nous le corrigerons plus tard). Nous créons également un nœud courant, rp, pour la liste de résultats.

Ensuite, nous parcourons les 2 listes. Nous avons un nœud actuel pour chaque liste. À chaque étape, nous regardons lequel des 2 nœuds actuels a la plus petite valeur et mettons ce nœud sur la liste des résultats. Déplacez ensuite le nœud actuel de cette liste (celui qui était plus petit) vers le nœud suivant de la liste. Nous devons également déplacer le nœud actuel du résultat vers l'endroit suivant.

Notre logique de boucle consiste simplement à continuer ainsi jusqu'à ce que nous atteignions la fin de l'une des listes. A ce stade, nous savons qu'il n'y a plus d'éléments à comparer pour l'une des listes ; ils sont déjà dans la liste des résultats. Ainsi, on peut alors simplement mettre les nœuds restants de l'autre liste à la fin du résultat, puisqu'on sait qu'ils sont déjà triés.

Comment feriez-vous cela différemment ? Pouvons-nous optimiser cela ? Faites-le-moi savoir dans les commentaires.

Merci !

Le code de cet article et de tous les articles de cette série peut être trouvé ici

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal