TGViewer
C/C++ Development | YeaHub C/C++ Development | YeaHub @yeahub_c_development · 739 subscribers
Post #9 217
#ЛитКод
Задача: 445. Add Two Numbers II


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

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

Пример:
Input: l1 = [7,2,4,3], l2 = [5,6,4]
Output: [7,8,0,7]


👨‍💻 Алгоритм:

1⃣Создайте два связанных списка r1 и r2, чтобы хранить перевернутые связанные списки l1 и l2 соответственно. Создайте два целых числа totalSum и carry для хранения суммы и переноса текущих цифр. Создайте новый ListNode, ans, который будет хранить сумму текущих цифр. Мы будем складывать два числа, используя перевернутый список, добавляя цифры по одной. Продолжаем, пока не пройдем все узлы в r1 и r2.

2⃣Если r1 не равен null, добавляем r1.val к totalSum. Если r2 не равен null, добавляем r2.val к totalSum. Устанавливаем ans.val = totalSum % 10. Сохраняем перенос как totalSum / 10. Создаем новый ListNode, newNode, который будет иметь значение как перенос. Устанавливаем next для newNode как ans. Обновляем ans = newNode, чтобы использовать ту же переменную ans для следующей итерации. Обновляем totalSum = carry.

3⃣Если carry == 0, это означает, что newNode, созданный в финальной итерации цикла while, имеет значение 0. Поскольку мы выполняем ans = newNode в конце каждой итерации цикла while, чтобы избежать возврата связанного списка с головой, равной 0 (начальный ноль), возвращаем следующий элемент, т.е. возвращаем ans.next. В противном случае, если перенос не равен 0, значение ans не равно нулю. Следовательно, просто возвращаем ans.

😎 Решение:
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* prev = nullptr;
ListNode* temp = nullptr;
while (head != nullptr) {
temp = head->next;
head->next = prev;
prev = head;
head = temp;
}
return prev;
}

ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* r1 = reverseList(l1);
ListNode* r2 = reverseList(l2);

int totalSum = 0;
int carry = 0;
ListNode* ans = new ListNode(0);
while (r1 != nullptr || r2 != nullptr) {
if (r1 != nullptr) {
totalSum += r1->val;
r1 = r1->next;
}
if (r2 != nullptr) {
totalSum += r2->val;
r2 = r2->next;
}

ans->val = totalSum % 10;
carry = totalSum / 10;
ListNode* head = new ListNode(carry);
head->next = ans;
ans = head;
totalSum = carry;
}

return carry == 0 ? ans->next : ans;
}
};


👉Новости 👉Платформа
  • 👍 1
More from @yeahub_c_development
  1. Oct 16, 2026#documentation #яндекс #алгоритмы 📚 Структурный подход к алгоритмам: от теории к практике…
  2. Oct 14, 2026#Собес #null #pointer #memory_safety 🤔 Что такое NULL в C? 💬 Кратко: NULL — это макрос,…
  3. Oct 12, 2026#Собес #heap #stack #memory 🤔 Где будут располагаться переменные типа массив и map — на к…
  4. Oct 9, 2026#video #архитектура 📚 Road to Highload: видеопроект о проектировании архитектуры высокона…
  5. Oct 8, 2026#Собес #Docker_Registry #container_registry #Docker_Hub 🤔 Что такое Docker Registry и для…
  6. Oct 7, 2026#Собес #stack #heap #memory_management 🤔 Как отличается время жизни объектов в стеке и ку…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →