Задать вопрос
@robocop45

Объясните пожалуйста работу этого кода?

задача с leetcode - https://leetcode.com/problems/merge-two-sorted-lis...

Вам даны заголовки двух отсортированных связанных списков list1 и list2.
Объедините два списка в один отсортированный список. Список должен быть составлен путем соединения узлов первых двух списков.
Возвращает заголовок объединенного связанного списка.

Посмотрел решения и везде они +- одинаковые

решение
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def mergeTwoLists(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
        curr = dummy = ListNode()
        while l1 and l2:
            if l1.val >l2.val:
                curr.next = l2 
                l2 = l2.next 
            else:
                curr.next = l1
                l1 =l1.next 
            curr = curr.next 
        
        if not l1:
            curr.next =l2 

        else:
            curr.next = l1 
        return dummy.next


у меня несколько вопросов
1)curr = dummy = ListNode()
что это за конструкция. ну вернее я знаю, что это объект класса, но зачем сразу 2 переменные? сделал вот так
dummy = ListNode() и не работает
2)
if l1.val >l2.val:
                curr.next = l2 
                l2 = l2.next

объясните пожалуйста вот эти 2 строчки
curr.next = l2 
l2 = l2.next

3) Почему возвращаем именно dummy и next?
return dummy.next
Буду всем очень благодарен!
  • Вопрос задан
  • 2609 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 2
bingo347
@bingo347
Crazy on performance...
1)curr = dummy = ListNode()
что это за конструкция. ну вернее я знаю, что это объект класса, но зачем сразу 2 переменные? сделал вот так
dummy = ListNode() и не работает

2 переменные нужны, что бы иметь ссылку и на начало и на конец списка, в конец будем добавлять ноды из других списков, а начало нужно чтоб потом сделать return

if l1.val >l2.val:
                curr.next = l2 
                l2 = l2.next
объясните пожалуйста вот эти 2 строчки
curr.next = l2 
l2 = l2.next
Через if выбрали из какого из 2 списков будем вставлять ноду в наш список и добавили ее туда, потом запомнили ссылку на следующую ноду выбранного списка

3) Почему возвращаем именно dummy и next?
return dummy.next
В dummy у нас начальная нода нашего списка, но она опорная, мы ее сами создали, а не взяли из исходных списков, а вот следующая - уже нода одного из списков.
Ответ написан
fenrir1121
@fenrir1121
Начни с документации
что это за конструкция. ну вернее я знаю, что это объект класса, но зачем сразу 2 переменные? сделал вот так
Два указателя на первый элемент списка чтобы не потерять начало. curr в процессе перемещается.

curr.next = l2 
l2 = l2.next

Привязываем минимальный элемент как следующий элемент нового списка, отвязываем от старого
Почему возвращаем именно dummy и next?

Потому что у нас первый элемент лежит в next, сам dummy это пустое начало нового списка

Я бы рекомендовал взять два списка с двумя-тремя элементами и пошагово посмотреть работу алгоритма или вообще нарисовать на бумаге, тогда все встанет на свои места.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы