Leetcode 002 Add Two Numbers
Soru
You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order, and each of their nodes contains a single digit. Add the two numbers and return the sum as a linked list.
You may assume the two numbers do not contain any leading zero, except the number 0 itself.
Örnek 1
Input: l1 = [2,4,3], l2 = [5,6,4]
Output: [7,0,8]
Explanation: 342 + 465 = 807.
Örnek 2
Input: l1 = [0], l2 = [0]
Output: [0]
Örnek 3
Input: l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
Output: [8,9,9,9,0,0,0,1]
Çözüm
- İki bağlı liste olarak temsil edilen iki sayıyı toplamanızı ister. Bu bağlı listeler, ters çevrilmiş sırayla sayıların basamaklarını tutar; yani, her liste başındaki düğüm bir sayının en düşük basamağını temsil eder ve her düğüm tek bir basamak tutar. Sorunun amacı, bu iki sayının toplamını aynı şekilde ters çevrilmiş bir bağlı liste olarak döndürmektir.
- Girdi: İki bağlı liste baş düğümü l1 ve l2. Her düğüm, bir tam sayı değer (0 ile 9 arası) tutar ve her liste en az bir düğüm içerir.
- Çıktı: İki sayının toplamını temsil eden, yeni bir ters çevrilmiş bağlı liste.
- Bu problemi çözmek için, iki liste üzerinde bir işaretçi kullanarak basamak basamak ilerler ve gerekirse taşıma (carry) uygularsınız. Yeni oluşturulan listenin her düğümü, karşılık gelen basamakların toplamını (ve varsa bir önceki taşımayı) içerir.
- Çalışma Mekanizması:
- Başlangıç Koşulları: dummy düğüm başlatılır ki, bu yeni oluşturulan sonucun başlangıcını işaret eder. current işaretçisi bu liste üzerinde hareket eder.
- Toplama ve Taşıma Yönetimi: Her iterasyonda, l1 ve l2den değerler alınır (liste sonunda yoksa 0 alınır). Bu değerler ve bir önceki taşımadan gelen değer toplanır. Toplamın 10’a bölümünden taşıma elde edilir ve kalan yeni basamak değeri olur.
- Liste İlerlemesi: İki liste de None olana kadar veya taşıma 0 olana kadar işlem devam eder.
- Sonuç: dummy.next, sonuç listesinin başını gösterir, çünkü dummy sadece başlangıç için kullanılan geçici bir düğümdür.
Code
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
class Solution:
def addTwoNumbers(self, l1, l2):
dummy = ListNode(0) # Sonuç listesi için dummy başlangıç düğümü
current = dummy
carry = 0
# l1 ve l2'nin sonuna kadar veya taşıma bitene kadar döngü
while l1 or l2 or carry:
val1 = (l1.val if l1 else 0)
val2 = (l2.val if l2 else 0)
# Yeni basamağın toplamı ve yeni taşıma
total = val1 + val2 + carry
carry = total // 10
total = total % 10
current.next = ListNode(total)
current = current.next
# İşaretçileri ilerlet
if l1:
l1 = l1.next
if l2:
l2 = l2.next
return dummy.next
Complexity
- Time complexity (Zaman Karmaşıklığı): O(max(n, m)), burada n ve m, l1 ve l2 uzunluklarıdır. En kötü durumda her iki liste de tamamen taranır.
- Space complexity (Alan Karmaşıklığı): O(max(n, m)), yeni bir liste oluşturulduğu için, en kötü durumda girdi listeleri kadar uzun olabilir.