Разбор задачи 2. Add Two Numbers LeetCode.com

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

Вы можете предположить, что эти два числа не содержат начальных нулей, кроме самого числа 0.

Ограничения:
Количество узлов в каждом связанном списке находится в диапазоне 
[1, 100].
0 <= Node.val <= 9
Гарантируется, что список представляет собой число, не имеющее лидирующих нулей.

Задача заключается в сложении двух чисел, представленных в виде связанных списков, где каждый узел хранит одну цифру числа. Сначала нужно пройти по обоим спискам, сложить соответствующие цифры чисел, начиная с младших разрядов, и сохранить результат в новый связанный список. Если сумма цифр превышает 9, то нужно запомнить единицу переноса и добавить ее к следующей сумме. Если какой-то список закончился раньше другого, то нужно просто продолжить сложение, используя нули вместо отсутствующих цифр.

Таким образом, алгоритм можно описать следующим образом:

  1. Создать новый связанный список, который будет содержать сумму двух чисел.
  2. Инициализировать два указателя на начало связанных списков.
  3. Инициализировать переменную для хранения единицы переноса.
  4. Пока оба указателя не достигнут конца связанных списков:
    1. Сложить две цифры из текущих узлов связанных списков и прибавить единицу переноса.
    2. Если сумма больше 9, то запомнить единицу переноса для следующей итерации.
    3. Создать новый узел в связанном списке с остатком от деления суммы на 10 (т.е. без учета единицы переноса).
    4. Перейти к следующим узлам обоих связанных списков.
  5. Если один из указателей дошел до конца связанного списка, а другой еще не дошел, то продолжить сложение с использованием нулей вместо отсутствующих цифр.
  6. Если после прохода по всем узлам осталась единица переноса, то добавить новый узел в конец связанного списка.

Временная сложность алгоритма составляет O(max(m, n)), где m и n — длины связанных списков, а пространственная сложность — O(max(m, n)+1), т.к. может потребоваться дополнительный узел для единицы переноса.

Решение Add Two Numbers LeetCode пример кода на Python

class Solution:
    def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
        # создание фиктивной (dummy) ноды для возврата
        dummy = ListNode()
        # установка указателя текущей (curr) ноды на dummy
        curr = dummy
        # инициализация переменной carry для хранения "переноса" в следующий разряд
        carry = 0
        # цикл, который будет выполняться до тех пор, пока l1 или l2 содержат ноды или есть остаток от прошлого разряда (carry)
        while l1 or l2 or carry:
            # инициализация переменной sum как текущей суммы
            sum = carry
            # если l1 не равно None, то добавляем его значение в sum и перемещаемся на следующий узел
            if l1:
                sum += l1.val
                l1 = l1.next
            # если l2 не равно None, то добавляем его значение в sum и перемещаемся на следующий узел
            if l2:
                sum += l2.val
                l2 = l2.next
            # вычисляем carry для следующей итерации
            carry = sum // 10
            # создание новой ноды с результатом текущей суммы в текущем разряде
            curr.next = ListNode(sum % 10)
            # перемещаем указатель на следующую ноду
            curr = curr.next
        # возврат ноды, следующей за фиктивной нодой (dummy)
        return dummy.next


class ListNode:
    def __init__(self, val=0, next=None):
        # инициализация значения текущей ноды (val) и указателя на следующую ноду (next)
        self.val = val
        self.next = next

Решение Add Two Numbers LeetCode пример кода на Java

public class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        // создание фиктивной (dummy) ноды для возврата
        ListNode dummy = new ListNode(0, null);
        // установка указателя текущей (curr) ноды на dummy
        ListNode curr = dummy;
        // инициализация переменной carry для хранения "переноса" в следующий разряд
        int carry = 0;
        // цикл, который будет выполняться до тех пор, пока l1 или l2 содержат ноды или есть остаток от прошлого разряда (carry)
        while (l1 != null || l2 != null || carry != 0) {
            // инициализация переменной sum как текущей суммы
            int sum = carry;
            // если l1 не равно null, то добавляем его значение в sum и перемещаемся на следующий узел
            if (l1 != null) {
                sum += l1.val;
                l1 = l1.next;
            }
            // если l2 не равно null, то добавляем его значение в sum и перемещаемся на следующий узел
            if (l2 != null) {
                sum += l2.val;
                l2 = l2.next;
            }
            // вычисляем carry для следующей итерации
            carry = sum / 10;
            // создание новой ноды с результатом текущей суммы в текущем разряде
            curr.next = new ListNode(sum % 10, null);
            // перемещаем указатель на следующую ноду
            curr = curr.next;
        }
        // возврат ноды, следующей за фиктивной нодой (dummy)
        return dummy.next;
    }
}

Решение Add Two Numbers LeetCode пример кода на C++

class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        // создание фиктивной (dummy) ноды для возврата
        ListNode *dummy = new ListNode(0, nullptr);
        // установка указателя текущей (curr) ноды на dummy
        ListNode *curr = dummy;
        // инициализация переменной carry для хранения "переноса" в следующий разряд
        int carry = 0;
        // цикл, который будет выполняться до тех пор, пока l1 или l2 содержат ноды или есть остаток от прошлого разряда (carry)
        while (l1 || l2 || carry) {
            // инициализация переменной sum как текущей суммы
            int sum = carry;
            // если l1 не равно nullptr, то добавляем его значение в sum и перемещаемся на следующий узел
            if (l1) {
                sum += l1->val;
                l1 = l1->next;
            }
            // если l2 не равно nullptr, то добавляем его значение в sum и перемещаемся на следующий узел
            if (l2) {
                sum += l2->val;
                l2 = l2->next;
            }
            // вычисляем carry для следующей итерации
            carry = sum / 10;
            // создание новой ноды с результатом текущей суммы в текущем разряде
            curr->next = new ListNode(sum % 10, nullptr);
            // перемещаем указатель на следующую ноду
            curr = curr->next;
        }
        // возврат ноды, следующей за фиктивной нодой (dummy)
        return dummy->next;
    }
};

Решение Add Two Numbers LeetCode пример кода на JavaScript

// объявляем функцию addTwoNumbers с двумя аргументами l1 и l2
var addTwoNumbers = function(l1, l2) {
    // создаем новый узел и присваиваем его переменной dummy
    let dummy = new ListNode();
    // присваиваем переменной curr значение dummy
    let curr = dummy;
    // объявляем переменную carry и присваиваем ей значение 0
    let carry = 0;
    // запускаем цикл, который работает, пока l1, l2 или carry не станут равными null или 0 соответственно
    while (l1 || l2 || carry) {
        // объявляем переменную sum и присваиваем ей значение carry
        let sum = carry;
        // если l1 не равно null
        if (l1) {
            // добавляем значение l1.val к переменной sum
            sum += l1.val;
            // присваиваем l1 следующий узел
            l1 = l1.next;
        }
        // если l2 не равно null
        if (l2) {
            // добавляем значение l2.val к переменной sum
            sum += l2.val;
            // присваиваем l2 следующий узел
            l2 = l2.next;
        }
        // вычисляем остаток от деления суммы на 10 и присваиваем его переменной curr.next
        curr.next = new ListNode(sum % 10);
        // переназначаем curr на curr.next
        curr = curr.next;
        // вычисляем целое от деления суммы на 10 и присваиваем его переменной carry
        carry = Math.floor(sum / 10);
    }
    // возвращаем следующий узел после dummy
    return dummy.next;
};

Решение Add Two Numbers LeetCode пример кода на C#

public class Solution {
    // объявляем метод AddTwoNumbers, который принимает два аргумента типа ListNode и возвращает ListNode
    public ListNode AddTwoNumbers(ListNode l1, ListNode l2) {
        // создаем новый узел и присваиваем его переменной dummy
        ListNode dummy = new ListNode();
        // присваиваем переменной curr значение dummy
        ListNode curr = dummy;
        // объявляем переменную carry и присваиваем ей значение 0
        int carry = 0;
        // запускаем цикл, который работает, пока l1, l2 или carry не станут равными null или 0 соответственно
        while (l1 != null || l2 != null || carry != 0) {
            // объявляем переменную sum и присваиваем ей значение carry
            int sum = carry;
            // если l1 не равно null
            if (l1 != null) {
                // добавляем значение l1.val к переменной sum
                sum += l1.val;
                // присваиваем l1 следующий узел
                l1 = l1.next;
            }
            // если l2 не равно null
            if (l2 != null) {
                // добавляем значение l2.val к переменной sum
                sum += l2.val;
                // присваиваем l2 следующий узел
                l2 = l2.next;
            }
            // вычисляем целое от деления суммы на 10 и присваиваем его переменной carry
            carry = sum / 10;
            // вычисляем остаток от деления суммы на 10 и создаем новый узел с этим значением и присваиваем его переменной curr.next
            curr.next = new ListNode(sum % 10);
            // переназначаем curr на curr.next
            curr = curr.next;
        }
        // возвращаем следующий узел после dummy
        return dummy.next;
    }
}

Если у вас не отображается решение последних задач, значит у вас включен блокировщик рекламы который вырезает эти ответы

Понравилась статья? Поделиться с друзьями:
Подписаться
Уведомить о
guest

0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x