From 91f344d110d2dc8ce7982065314a25afec963cc9 Mon Sep 17 00:00:00 2001 From: yus-yus Date: Tue, 4 Feb 2025 20:09:38 +0900 Subject: [PATCH 1/2] 2.Add Two Numbers --- 2.Add_Two_Numbers.md | 171 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 171 insertions(+) create mode 100644 2.Add_Two_Numbers.md diff --git a/2.Add_Two_Numbers.md b/2.Add_Two_Numbers.md new file mode 100644 index 0000000..b0286b4 --- /dev/null +++ b/2.Add_Two_Numbers.md @@ -0,0 +1,171 @@ +1st. +方針としてはすぐにたって半加算器のようにsとcarryを持てばよいとわかったが、 +```Python +while l1 or l2: +``` +となっていたことで最後の桁の繰り上がりが考慮されていなかった +ここに気づけずに解答をみることとなった。 +```Python +# Definition for singly-linked list. +# class ListNode: +# def __init__(self, val=0, next=None): +# self.val = val +# self.next = next +class Solution: + def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]: + dummy = ListNode(0) + s = dummy + carry = 0 + + while l1 or l2 or carry: + temp = 0 + temp += carry + carry = 0 + if l1: + temp += l1.val + l1 = l1.next + if l2: + temp += l2.val + l2 = l2.next + + s.next = ListNode(temp % 10) + s = s.next + carry = temp // 10 + + return dummy.next +``` +計算回数について見積もって置くと whileループが l1とl2のサイズの内大きい方+1(これは最後の桁あがりしだい)回る + +2nd. +特に変数名に見づらさがあると感じたので修正した +```Python +# Definition for singly-linked list. +# class ListNode: +# def __init__(self, val=0, next=None): +# self.val = val +# self.next = next +class Solution: + def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]: + dummy_node = ListNode() + result = dummy_node + carry = 0 + + while l1 or l2 or carry: + digit = carry + carry = 0 + + if l1 is not None: + digit += l1.val + l1 = l1.next + if l2 is not None: + digit += l2.val + l2 = l2.next + + result.next = ListNode(digit % 10) + carry = digit // 10 + + result = result.next + + return dummy_node.next +``` + +82.と同様にdummyを使わない方法でも実装してみた +```Python +# Definition for singly-linked list. +# class ListNode: +# def __init__(self, val=0, next=None): +# self.val = val +# self.next = next +class Solution: + def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]: + first_val = l1.val + l2.val + carry = first_val // 10 + head = ListNode(first_val % 10) + result = head + l1 = l1.next + l2 = l2.next + + while l1 or l2 or carry: + digit = carry + + if l1 is not None: + digit += l1.val + l1 = l1.next + if l2 is not None: + digit += l2.val + l2 = l2.next + + result.next = ListNode(digit % 10) + carry = digit // 10 + result = result.next + + return head +``` + +digitはその桁の"値"という意味にしたかったので一度totalに入れてから、digitとcarryに入れなおすようにした +少し丁寧すぎる気もするが、可読性はあがったと思う + +[参考にさせていただいたコード](https://github.com/katataku/leetcode/pull/4/files) + +```Python +# Definition for singly-linked list. +# class ListNode: +# def __init__(self, val=0, next=None): +# self.val = val +# self.next = next +class Solution: + def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]: + + dummy_node = ListNode() + result = dummy_node + carry = 0 + + while carry != 0 or l1 is not None or l2 is not None: + total = carry + + if l1 is not None: + total += l1.val + l1 = l1.next + if l2 is not None: + total += l2.val + l2 = l2.next + + digit = total % 10 + carry = total // 10 + result.next = ListNode(digit) + result = result.next + + return dummy_node.next +``` + +3rd. +解き方はかなりしっくり来ていたので読みやすいコードになるように丁寧に繰り返し書いた。 +```Python +# Definition for singly-linked list. +# class ListNode: +# def __init__(self, val=0, next=None): +# self.val = val +# self.next = next +class Solution: + def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]: + dummy_node = ListNode() + result = dummy_node + carry = 0 + + while l1 is not None or l2 is not None or carry != 0: + total = carry + + if l1 is not None: + total += l1.val + l1 = l1.next + if l2 is not None: + total += l2.val + l2 = l2.next + + digit = total % 10 + carry = total // 10 + result.next = ListNode(digit) + result = result.next + + return dummy_node.next +``` From fafbcd18892acb6a88cc3c3c6e55fd830ff73434 Mon Sep 17 00:00:00 2001 From: yus-yus Date: Fri, 7 Feb 2025 11:51:25 +0900 Subject: [PATCH 2/2] Add files via upload --- 2.Add_Two_Numbers.md | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/2.Add_Two_Numbers.md b/2.Add_Two_Numbers.md index b0286b4..98783ba 100644 --- a/2.Add_Two_Numbers.md +++ b/2.Add_Two_Numbers.md @@ -169,3 +169,41 @@ class Solution: return dummy_node.next ``` + +4th. +番兵を使う書き方。 +```Python +total = l1.val + l2.val + carry +``` +と書けるため可読性があがる。 +```Python +# Definition for singly-linked list. +# class ListNode: +# def __init__(self, val=0, next=None): +# self.val = val +# self.next = next +class Solution: + def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]: + dummy_node = ListNode() + result = dummy_node + carry = 0 + + while l1 is not None or l2 is not None or carry != 0: + if not l1: + l1 = ListNode(0) + if not l2: + l2 = ListNode(0) + + total = l1.val + l2.val + carry + digit = total % 10 + carry = total // 10 + result.next = ListNode(digit) + result = result.next + + if l1: + l1 = l1.next + if l2: + l2 = l2.next + + return dummy_node.next +```