2017-02-05 11 views
0

Вопрос - объединить два отсортированных связанных списка. Для получения дополнительной информации -visit https://www.hackerrank.com/challenges/merge-two-sorted-linked-lists Когда я отправляю это на сайт, он показывает «Завершение из-за таймаута». Пожалуйста, сообщите мне, что не так с кодом, и как его исправить.Почему этот код показывает завершение из-за тайм-аута на 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

Можете ли вы объяснить словами, что ваш алгоритм пытается сделать? (более подробно, чем списки слияний) –

+0

Операторы, устанавливающие h в h.next в инструкции if, где t в качестве главы списка результатов определены, являются неправильными. h указывает на узел, где ссылка на преемника должна быть установлена ​​в следующем поле, но для первого узла это первый узел; только после этого он должен быть продвинут. Кроме того, последнее утверждение if выглядит неправильно; он должен содержать h.next с левой стороны и должен быть симметричным w.r.t. списки A и B. – laune

+0

Спасибо, Луэна, я понял это. –

ответ

0

код не отображается правильно объединить два списка, Laune прокомментировал большинство ошибок, плюс код следующего за другой в то время как() цикл нужно исправить (это должен следовать той же логике, что и в цикле while()). Тайм-аут, вероятно, происходит не потому, что ваш код занимает слишком много времени, а потому, что проверка слияния hackerrank на возвращаемом объединенном списке застревает в цикле или после плохой ссылки.

Попробуйте создать тестовую программу, которая вызывает функцию MergeLists для ее отладки.

Чтобы обойти ограничение, что Java не имеет указателей на указатели, можно упростить код, используя фиктивный узел:

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