Пример решения задачи #2 на Python LeetCode — Сложить два числа

Опубликовано: 01.12.2024, 01:26 | Автор: hdhAI

Вариант решения задачи на языке программирования Python с LeetCode.
Категория: Алгоритмы.
Название задачи: Сложить два числа (Add Two Numbers).
Сложность: Средняя.
Статус решения: "Решено".

Условие задачи:
Даны два непустых связанных списка, представляющих два неотрицательных целых числа. Цифры хранятся в обратном порядке, и каждый из их узлов содержит одну цифру. Сложите два числа и верните сумму в виде связанного списка. Вы можете предположить, что эти два числа не содержат начальных нулей, кроме самого числа 0.

Решение:


Python

class Solution(object):
    def addTwoNumbers(self, l1, l2):
        """
        :type l1: Optional[ListNode]
        :type l2: Optional[ListNode]
        :rtype: Optional[ListNode]
        """
        # Создаем фиктивного узел, который будет началом результирующего списка
        dummy_head = ListNode(0)
        # Устанавливаем текущий узел равным временному узлу
        current = dummy_head
        # Устанавливаем перенос равным 0
        carry = 0

        # Пока l1 или l2 не пустые или есть перенос
        while l1 is not None or l2 is not None or carry != 0:
            # Если l1 не пуст, берем его значение, иначе 0
            val1 = l1.val if l1 is not None else 0
            # Если l2 не пуст, берем его значение, иначе 0
            val2 = l2.val if l2 is not None else 0
            # Считаем сумму значений и переноса
            sum_ = val1 + val2 + carry
            # Устанавливаем перенос равным 1, если сумма больше или равна 10, иначе 0
            carry = 1 if sum_ >= 10 else 0
            # Создаем новый узел с остатком от деления суммы на 10
            new_node = ListNode(sum_ % 10)
            # Добавляем новый узел в конец результирующего списка
            current.next = new_node
            # Переходим к следующему узлу в результирующем списке
            current = current.next
            # Если l1 не пуст, переходим к следующему узлу в l1
            if l1 is not None:
                l1 = l1.next
            # Если l2 не пуст, переходим к следующему узлу в l2
            if l2 is not None:
                l2 = l2.next

        # Возвращаем следующий узел после фиктивного узла, который является началом результирующего списка
        return dummy_head.next

Объяснение кода

Данный код эффективно реализует сложение двух чисел, представленных в виде односвязных списков. Использование фиктивного узла и четкая организация цикла позволяют получить лаконичное и понятное решение. Этот код можно адаптировать для решения других задач, связанных с обработкой односвязных списков.

Ключевые моменты:
Фиктивный узел: упрощает обработку первого узла.
Перенос: обеспечивает корректное сложение многозначных чисел.
Оператор % 10: используется для получения последней цифры числа.
Возврат dummy_head.next: исключает фиктивный узел из результата.

Источник решения: hdhai.com

Похожие статьи
Интересное





Warning: file_put_contents(/var/www/angella1/data/www/hdhai.com/counter/count.php): Failed to open stream: Permission denied in /var/www/angella1/data/www/hdhai.com/counter.php on line 89