2017-02-05 1 views
0

Question is- Fusionner deux listes liées triées. Pour plus de détails -visiter https://www.hackerrank.com/challenges/merge-two-sorted-linked-lists Lorsque je le soumets sur le site, il affiche «Terminé en raison de délai d'attente» .S'il vous plaît me dire ce qui ne va pas avec le code, et comment y remédier.Pourquoi ce code est affiché terminé à cause de timeout sur hackerrank

Node MergeLists(Node headA, Node headB) { 
// This is a "method-only" submission. 
// You only need to complete this method 
if(headA==null){ 
    return headB; 
}else if(headB==null){ 
    return headA; 
}else{ 
    Node h,t; 
    if(headA.data>=headB.data){ 
     h=headB; 
     t=h; 
     h=h.next; 
     headB=headB.next; 
    }else{ 
     h=headA; 
     t=h; 
     h=h.next; 
     headA=headA.next; 
    } 
    while(headA!=null && headB!=null){ 
     if(headA.data>=headB.data){ 
     h.next=headB; 
     h=h.next; 
     headB=headB.next; 
    }else{ 
     h=headA; 
     h=h.next; 
     headA=headA.next; 
    } 
    } 
    if(headB==null){ 
     h=headA; 
    } 
    return t; 
} 

}

+0

Pouvez-vous expliquer avec des mots ce que votre algorithme tente de le faire? (plus en détail que les listes de fusion) –

+0

Les instructions qui définissent h sur h.next dans l'instruction if, où t en tant que tête de la liste de résultats est déterminée, sont incorrectes. h pointe vers le noeud où le lien vers le successeur doit être défini dans le champ suivant, mais pour le premier noeud, il s'agit du premier noeud; seulement après cela il doit être avancé. En outre, la dernière instruction if ne semble pas correcte; il devrait contenir un h.next sur le côté gauche et devrait être symétrique w.r.t. listes A et B. – laune

+0

Merci laune, je l'ai compris. –

Répondre

0

Le code ne semble pas fusionner correctement les deux listes, Laune a commenté sur la plupart des erreurs, plus le code suivant l'autre dans la boucle while() a besoin d'une solution (il devrait suivre la même logique que la boucle if dans le while(). Le délai d'attente ne se produit probablement pas parce que votre code prend trop de temps, mais parce que la vérification post-fusion hackerrank sur la liste fusionnée retournée est bloquée dans un cycle ou suite à une mauvaise référence. Essayez de créer un programme de test qui appelle votre fonction MergeLists afin de le déboguer.

Pour contourner la limitation que Java ne dispose pas de pointeurs de pointeurs, vous pouvez simplifier le code en utilisant un noeud fictif:

Node t = new Node; 
    Node h = t; 
    // ... h.next = ... merge the lists while advancing h 
    return t.next;