ویرگول
ورودثبت نام
Mahdi Shamlou
Mahdi Shamlouیک برنامه نویس عاشق ریاضیات که گه گاهی دستی بر قلم دارد
Mahdi Shamlou
Mahdi Shamlou
خواندن ۴ دقیقه·۱ سال پیش

حل سوال دوم LeetCode

با سلام و عرض ادب خدمت همه شما دوستان
اول باید بگم بسیار خوشحالم که شما در حال مطالعه این متن هستید و بدونید خیلی خوشحال میشم اگر نکته برای بهبود این سری ها داشتید با من در میان بگزارید
خب در این قسمت به سراغ حل سوال دوم از لیست سوالات سایت LeetCode میریم
و اما سوال :
اون طوری که من متوجه شدم و تونستم سوال رو حل کنم فهمیدم که دو لیست پیوندی به ما داده میشه که این دو لیست اعداد چند رقمی بر عکس هستن و باید این اعداد باهم جمع شده و در قالب یک لیست پیوندی برعکس خروجی داده بشود .


Mahdi Shamlou
Mahdi Shamlou
https://github.com/mahdi0shamlou/LeetCode



class ListNode(object): def __init__(self, val=0, next=None): self.val = val self.next = next class Solution(object): def addTwoNumbers(self, l1, l2): res = self.sum(l1,l2,0) return res def sum(self, l1, l2, added): posetive = l1.val + l2.val + added added = 0 if posetive >= 10: posetive = posetive - 10 added = 1 if l1.next != None and l2.next != None: list_node = ListNode(val=posetive, next=self.sum(l1.next, l2.next, added)) elif l2.next == None and l1.next != None: list_node = ListNode(val=posetive, next=self.sum(l1.next, ListNode(val=0, next=None), added)) elif l2.next != None and l1.next == None: list_node = ListNode(val=posetive, next=self.sum(ListNode(val=0, next=None), l2.next, added)) else: list_node = ListNode(val=posetive, next=None) return list_node

خب همون طوری که دارید میبیند در قطعه کد بالا یک کلاس وجود داره به نام ListNode که تعریف همون لیست پیوندی هست که به شما گفتم !
اما قبل از ورود به مرحله بعد باید بگم من این سوال با توابع بازگشتی حل کردم اگر چیزی درباره توابع بازگشتی نمیدونید بهتره قبلش یکم مطالعه کنید راستی میتونید از چت جی پی تی هم بپرسید (:

خب بریم سراغ حل :
همون طور که میبیند تابع پایینی تابعی هست که خروجی ما رو به سایت LeetCode برمیگردونه ( بهتره بگم سایت LeetCode این تابع رو فراخوانی میکنه )

def addTwoNumbers(self, l1, l2): res = self.sum(l1,l2,0) return res

من برای اینکه بتونم از توابع بازگشتی استفاده کنم تابع زیر رو تعریف کردم :

def sum(self, l1, l2, added): posetive = l1.val + l2.val + added added = 0 if posetive >= 10: posetive = posetive - 10 added = 1 if l1.next != None and l2.next != None: list_node = ListNode(val=posetive, next=self.sum(l1.next, l2.next, added)) elif l2.next == None and l1.next != None: list_node = ListNode(val=posetive, next=self.sum(l1.next, ListNode(val=0, next=None), added)) elif l2.next != None and l1.next == None: list_node = ListNode(val=posetive, next=self.sum(ListNode(val=0, next=None), l2.next, added)) else: list_node = ListNode(val=posetive, next=None) return list_node

خب بریم سراغ توضیحات تابع اصلی :
همون طور که مشاهده میکنید این تابع دولیستی که از leetcode میگیریم رو به عنوان ورودی میگیریم همچنین یک متغیر به نام added که این رو در هر استپ به اعداد قبلی اضافه خواهیم کرد .

def sum(self, l1, l2, added): posetive = l1.val + l2.val + added added = 0

در هر مرحله یک متغیر به نام posetive رو حساب میکنیم که از جمع هر کدام از نود های لیست ماست .
در مرحله بعد که یک شرط وجود دارد که اگر posetive بیشتر از ۱۰ باشه added رو مساوی یک میزاره و posetive رو ۱۰ تا ازش کم میکنه ( این همون روش جمعی هست که همه از دوران ابتدایی بلدیم(: ! )

posetive = l1.val + l2.val + added added = 0 if posetive >= 10: posetive = posetive - 10 added = 1

و در شروط بعدی که مشاهده میکنید برای وجود نداشتن نود های بعدی هر کدوم از لیست ها تصمیم گیری شده که دوباره خود همین تابع صدا زده میشود . برای مثال یکی از شرط های زیر رو توضیح میدم

elif l2.next == None and l1.next != None: list_node = ListNode(val=posetive, next=self.sum(l1.next, ListNode(val=0, next=None), added))

در این شرطی که دارید می بینید سیستم ما اگر نود بعدی لیست دوم رو پیدا نکنه ( یعنی همون وجود نداشته باشه ) و لیست اول نود بعدی داشته باشه میایم و یک نود جدید میسازیم که مقدارش posetive هست و نود بعدیش خروجی همین تابع با ورودی هایی که میبیند هست ( ورودی اول (نود بعدی لیست اول هست) و (ورودی دوم به علت اینکه نود بعدی در لیست دوم وجود ندارد یک نود خالی هست که مقدارش صفر و نود بعدی اش نان هست ))
به همین سادگی و باحالی !
اگر سوالی داشتید در خدمتتون هستم و اگر نکته ای برای بهبود این کد دارید خوشحالم میشم توی گیت هاب مطرحش کنید ! ایدی گیت هاب من هم mahdi0shamlou هست !



برنامه نویسیبرنامه نویسحل مسئله
۷
۴
Mahdi Shamlou
Mahdi Shamlou
یک برنامه نویس عاشق ریاضیات که گه گاهی دستی بر قلم دارد
شاید از این پست‌ها خوشتان بیاید