Question d'entrevue: la Fusion des deux triés séparément des listes liées, sans créer de nouveaux nœuds
C'est une programmation à la question posée au cours d'une épreuve écrite pour une entrevue.
"Vous avez deux isolés des listes liées qui sont déjà triés, vous avez à les fusionner et de retourner la tête de la nouvelle liste sans créer de nouveaux nœuds supplémentaires. La liste retournée doit être triées"
La signature de la méthode est:
Nœud MergeLists(Nœud de la liste 1, Nœud de la liste 2);
Classe de nœud est ci-dessous:
class Node{
int data;
Node next;
}
J'ai essayé de nombreuses solutions, mais pas la création d'un nœud supplémentaire vis les choses. S'il vous plaît aider.
Ici est l'accompagnement d'une entrée de blog http://techieme.in/merging-two-sorted-singly-linked-list/
- le dernier élément de la liste 1 plus petit que le premier élément de la liste 2?
- Veuillez noter: j'ai aussi trouvé une solution sur stackoverflow.com/questions/2348374/merging-two-sorted-lists mais ce lors de l'exécution des bâtons dans une boucle infinie.
- Il peut être n'importe quoi. Les deux listes sont tries et le code doit produire une troisième liste est triée.
- C'est parce que si le dernier élément de la liste 1 est plus petit que le premier élément de la liste 2, vous pouvez simplement modifier le dernier nœud suivant de la première liste 2 tête de nœud.
- C'est extrêmement optimiste de penser à ce genre d'entrée que vous obtiendrez.
- Les listes chaînées sont 1) 1->2->3->4->5 2) 1->2
- vous devez utiliser deux pointeurs, l'un au point de la première liste et la deuxième à un point de la deuxième liste. vous déplacez les pointeurs un à la fois. aussi, vous devez préciser si ce doit être en place pour une liste ou si la création de la troisième liste ok. dans l'ensemble. de toute façon. facile avec l'aide de deux pointeurs.
Vous devez vous connecter pour publier un commentaire.
La récursivité ne devrait pas être nécessaire d'éviter d'allouer un nouveau nœud:
if (list1.next == null) list1.next = list2;
peut-être justelist1.next = list2;
. Depuis lewhile (list1.next != null)
boucle a tout simplement résilié on peut être sûr quelist1.next == null
.Voici l'algorithme sur la façon de fusionner deux triés listes A et B:
Ici C est la liste de sortie.
Regardez ma, pas de récursivité!
Itération peut être fait comme ci-dessous. Complexité = O(n)
Ce qui pourrait être fait sans créer le nœud supplémentaire, avec simplement un autre Nœud de référence en passant à l'paramètres (Nœud de temp).
Je voudrais partager comment j'ai pensé à la solution... j'ai vu la solution qui consiste à la récursivité et ils sont assez incroyable, est le résultat de bien fonctionnelle et modulaire de la pensée. J'apprécie vraiment le partage.
Je voudrais ajouter que la récursivité de ne pas travailler pour de grands lits, la pile des appels de débordement; j'ai donc décidé de tenter l'approche itérative... et c'est ce que je reçois.
Le code est assez explicite, j'ai ajouté quelques commentaires en ligne pour essayer de garantir cela.
Si vous ne l'obtenez pas, veuillez m'en informer et je vais améliorer la lisibilité (peut-être que je vais avoir une fausse interprétation de ma propre code).
}
Une simple solution itérative.
Je montre ci-dessous une solution itérative. Une solution récursive serait plus compact, mais puisque nous ne connaissons pas la longueur de la liste, la récursivité court le risque de débordement de la pile.
L'idée de base est similaire à l'étape de fusion et publipostage dans la fusion de tri; nous de garder un pointeur correspondant à chaque entrée de la liste; à chaque itération, on avance le pointeur correspondant au plus petit élément. Cependant, il y a une différence cruciale où la plupart des gens trébucher. Dans la fusion de tri, puisque nous utilisons une matrice de résultats, la position suivante à insérer est toujours l'indice de la matrice de résultats. Pour une liste liée, nous avons besoin de garder un pointeur sur le dernier élément de la liste triée. Le pointeur peut sauter autour d'une entrée de la liste à l'autre en fonction de celui qui a le plus petit élément pour l'itération en cours.
Avec qui, le code suivant doit être auto-explicatif.
D'abord de comprendre la moyenne de "sans créer de nouveaux nœuds supplémentaires", ce Que je comprends, cela ne signifie pas que je ne peux pas avoir pointeur(s) qui pointe vers un nœud existant(s).
Vous ne pouvez pas l'atteindre sans parler des pointeurs vers les nœuds existants, même si vous utiliser la récursivité pour atteindre le même, le système va créer des pointeurs pour vous que les piles d'appels. C'est comme dire système pour ajouter des liens, qui vous avez évité dans votre code.
Fonction Simple pour atteindre le même avec prise supplémentaire pointeurs:
Veuillez consulter mon blog pour http://www.algorithmsandme.com/2013/10/linked-list-merge-two-sorted-linked.html
Ici est un exemple de travail qui utilise la liste liée mis en œuvre en java.util. Vous pouvez simplement copier-coller le code ci-dessous à l'intérieur d'une méthode main ().
Façon récursive(variante de Stefan réponse)
Examiner ci-dessous liste liée à visualiser ce
2>4
Une liste1>3
liste BPresque la même réponse(non récursif) comme Stefan, mais avec un peu plus de commentaires/significatifs nom de la variable. Également couverts double liste chaînée dans les commentaires si quelqu'un est intéressé
Prenons l'exemple
5->10->15>21 //List1
2->3->6->20 //List2
Mon point de vue sur la question est comme ci-dessous:
Pseudocode:
Code:
:)GlbMP
Voici le code sur la façon de fusionner deux triés listes liées headA et headB: