Conversation
|
|
||
| runner.val = val_sum % 10 | ||
| carry_up = val_sum // 10 | ||
| if l1 or l2 or carry_up > 0: |
There was a problem hiding this comment.
l1 or l2 or carry_up > 0の重複を無くせそうでしょうか?
There was a problem hiding this comment.
while True:
val_sum = 0
if l1:
val_sum += l1.val
l1 = l1.next
if l2:
val_sum += l2.val
l2 = l2.next
val_sum += carry
runner.val = val_sum % 10
carry = val_sum // 10
if not (l1 or l2 or carry > 0):
break
runner.next = ListNode()
runner = runner.nextこれなら行けますが個人的にwhile Trueはエッジケースに引っかかった場合の永遠ループが怖くて実務では使いたくないですね。
ほかの方のrunner.nextに足した結果のノードを置いていく方式ならwhile文にl1 or l2 or carry > 0を置くだけで良さそうです。
There was a problem hiding this comment.
同値ですね。while文の外にcan_create_next_node = l1 or l2 or carry > 0
と置く感じでしょうか
There was a problem hiding this comment.
あ、「コメントのコードも元のコードも振る舞いは同じではないでしょうか」という意味でした。
変数に置いても、結局2箇所で更新が必要そうですね。
There was a problem hiding this comment.
永遠ループではなく、無限ループではないですか?永久ループと呼ぶことはあると思いますが、永遠ループは聞いたことがなさそうです。振る舞いが同値だとすると、while Trueという見た目で、無限ループを心配するのは違和感があります。
https://e-words.jp/w/%E7%84%A1%E9%99%90%E3%83%AB%E3%83%BC%E3%83%97.html
There was a problem hiding this comment.
たしかに永遠ループ呼びは良くないですね。
while l1 or l2 or carry > 0に関してもl1, l2, carryが正しく更新されないと無限ループに入る可能性があるのでwhile Trueに対して無限ループに怯えるのは筋違いですね。ただ個人的にはwhile Trueよりwhile l1 or l2 or carry > 0の方が終了条件の可読性が良いので好きですね。
There was a problem hiding this comment.
同じ条件式を繰り返すのは、DRYに反するので、好ましくないかなと。while Trueの方なら、do whileに相当するので、すんなり読めそうです。
There was a problem hiding this comment.
次のループのノードを先に用意しておく必要がない、下のダミーノードの方法の方が総合的に優れているように感じました。
There was a problem hiding this comment.
なるほど、ノード関係の問題はdummyが役立ちそうな場面が多そうなので常に選択肢に持っておきます。
| @@ -0,0 +1,121 @@ | |||
| ## step1: | |||
| まずl1, l2のheadからポインタを順番に線形探索していって、各ノードでvalを足してもし繰り上げがあればそれを次のノード同士での足し算で利用すれば実装できそうだと感じた。なので答えをanswer_headとしてrunnerにl1とl2の各ノードの足した結果を新しいノードとして順次生成してもらってそれを答えとする方針でいく。 | |||
There was a problem hiding this comment.
何らかの値を探索しているわけではないのに、線形探索と呼ぶのは誤用じゃないでしょうか?
There was a problem hiding this comment.
O(N)のものはなんでも線形探索って言ってました...
正しくは線形走査(linear scan)ですね
| # self.next = next | ||
| class Solution: | ||
| def addTwoNumbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]: | ||
| carry_up = 0 |
There was a problem hiding this comment.
変数名は、carry_upであっていますか?
| @@ -0,0 +1,121 @@ | |||
| ## step1: | |||
| まずl1, l2のheadからポインタを順番に線形探索していって、各ノードでvalを足してもし繰り上げがあればそれを次のノード同士での足し算で利用すれば実装できそうだと感じた。なので答えをanswer_headとしてrunnerにl1とl2の各ノードの足した結果を新しいノードとして順次生成してもらってそれを答えとする方針でいく。 | |||
| @@ -0,0 +1,121 @@ | |||
| ## step1: | |||
| まずl1, l2のheadからポインタを順番に線形探索していって、各ノードでvalを足してもし繰り上げがあればそれを次のノード同士での足し算で利用すれば実装できそうだと感じた。なので答えをanswer_headとしてrunnerにl1とl2の各ノードの足した結果を新しいノードとして順次生成してもらってそれを答えとする方針でいく。 | |||
There was a problem hiding this comment.
なので答えをanswer_headとしてrunnerにl1とl2の各ノードの足した結果を新しいノードとして順次生成してもらってそれを答えとする方針でいく。
コードを見ると、まずノードを作ってから、次のループで値を計算して代入しているので、説明と一致していなさそうですかね?
There was a problem hiding this comment.
たしかにこの説明はほかの人のdummyを使った解法で当てはまる説明ですね。
自分の解法はrunnerに値を代入する予定のノードを作成してそこにl1, l2, 繰り上がりの値を足した結果を代入する方針ですね。
| val_sum += carry_up | ||
|
|
||
| runner.val = val_sum % 10 | ||
| carry_up = val_sum // 10 |
There was a problem hiding this comment.
問題:2. Add Two Numbers
言語: Python3