Объединение двух отсортированных связанных списков в Python

1

Я решаю вопрос Leetcode (проблема № 21), который принимает два отсортированных связанных списка и возвращает отсортированный объединенный список. Например, Input: 1-> 2-> 4, 1-> 3-> 4 и Output: 1-> 1-> 2-> 3 → 4-> 4.

Я не супер опыт со связанными списками, но я пытаюсь решить больше проблем, чтобы получить доступ. Вместо возврата желаемого результата из [1,1,2,3,4,4] мой код просто возвращает [4]. Тем не менее, я думаю, что основная логика есть, и я надеюсь, что что-то небольшое.

def mergeTwoLists(self, l1, l2):
        """
        :type l1: ListNode
        :type l2: ListNode
        :rtype: ListNode
        """
        newList = ListNode(0) # used for single, merged list
        while l1 and l2:
            if l1.val <= l2.val: # compare current node values
                newList.next = l1
                l1 = l1.next
            else:
                newList.next = l2
                l2 = l2.next

        return newList.next # first node is 0, which we don't want
  • 0
    Есть два основных варианта этого. Один - объединить оба списка в пустой список, другой - объединить один из списков в другой, что может быть немного быстрее, поскольку в некоторых случаях требуется только ссылка на объединяемый список. продвинутый, в отличие от необходимости устанавливать связи.
Теги:
sorting
linked-list
merge

2 ответа

3
Лучший ответ

Основная логика почти отсутствует, но вы только каждый раз заменяете следующий элемент в списке (вы не продвинули список), таким образом вы возвращаете только последний элемент. Решение состоит в том, чтобы создать еще один "указатель курсора" для продвижения списка, сохраняя при этом newList "передним указателем" для возврата результата.

Также в конце вы должны "concat" с непустым списком

def mergeTwoLists(self, l1, l2):
    newList = ListNode(0)
    cur = newList 
    while l1 and l2:
        if l1.val < l2.val:
            cur.next = l1
            l1 = l1.next
        else:
            cur.next = l2
            l2 = l2.next
        cur = cur.next
    cur.next = l1 or l2 # add non-empty list
    return newList.next
  • 0
    Спасибо за вашу помощь и указание на проблемы в моем коде! Я понял вопрос о продвижении текущего указателя с помощью cur = cur.next. Однако у меня есть два дополнительных вопроса: 1) Что делает cur.next = l1 или l2? и 2) Что делает cur = newList / как newList.next может вернуть правильный результат?
  • 1
    @JaneSully 1) цикл while завершается, когда один список пуст, l1 or l2 дает нам непустой список, если он есть. if можно записать как: if l1: cur.next = l1 else: cur.next = l2
Показать ещё 4 комментария
0
a1=[3,9,1]
a2=[8,3,4]

a = a1 + a2
a.sort()

Должен сделать трюк.

  • 1
    Это сработало бы, если бы я использовал массивы, но проблема заключается в настройке связанных списков.
  • 0
    Список Python фактически мог бы использоваться для реальных связанных структур данных вместо списка чисел или символов, как было найдено во многих примерах. Я не осознавал, что автор действительно хочет использовать Python для решения проблемы связанного списка.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню