Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 48 additions & 0 deletions pullrequests/add_two_numbers/step1.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
//lint:file-ignore U1000 Ignore all unused code
package addtwonumbers

type ListNode struct {
Val int
Next *ListNode
}

/*
時間:8分35秒

方針自体はすぐに決まり、繰り上げと2つの数の桁数の違いに気をつけて、足していけばいいと考えました。末端のノードの値が0になるときの対処に少し悩みました。
とりあえず動くように書いたのでコードの重複などが多く、こなれていないコードだなと思います。
*/
func addTwoNumbers_step1(l1 *ListNode, l2 *ListNode) *ListNode {
dummy := new(ListNode)
dummy.Next = new(ListNode)
dummy.Next.Val = 0
curr := dummy
for l1 != nil && l2 != nil {
curr = curr.Next
sum := l1.Val + l2.Val + curr.Val
curr.Val = sum % 10
curr.Next = new(ListNode)
curr.Next.Val = sum / 10
l1, l2 = l1.Next, l2.Next
}
for l1 != nil {
curr = curr.Next
sum := l1.Val + curr.Val
curr.Val = sum % 10
curr.Next = new(ListNode)
curr.Next.Val = sum / 10
l1 = l1.Next
}
for l2 != nil {
curr = curr.Next
sum := l2.Val + curr.Val
curr.Val = sum % 10
curr.Next = new(ListNode)
curr.Next.Val = sum / 10
l2 = l2.Next
}
if curr.Next.Val == 0 {
curr.Next = nil
}
return dummy.Next
}
31 changes: 31 additions & 0 deletions pullrequests/add_two_numbers/step2.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
//lint:file-ignore U1000 Ignore all unused code
package addtwonumbers

/*
コードの重複を排除しました。ただまだ無駄な処理が多いです。
*/
func addTwoNumbers_step2(l1 *ListNode, l2 *ListNode) *ListNode {
dummy := new(ListNode)
dummy.Next = new(ListNode)
dummy.Next.Val = 0
curr := dummy
for l1 != nil || l2 != nil {
curr = curr.Next
sum := curr.Val
if l1 != nil {
sum += l1.Val
l1 = l1.Next
}
if l2 != nil {
sum += l2.Val
l2 = l2.Next
}
curr.Val = sum % 10
curr.Next = new(ListNode)
curr.Next.Val = sum / 10
}
if curr.Next.Val == 0 {
curr.Next = nil
}
return dummy.Next
}
27 changes: 27 additions & 0 deletions pullrequests/add_two_numbers/step3.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
//lint:file-ignore U1000 Ignore all unused code
package addtwonumbers

/*
carryを導入した方がより明確でシンプルに書けると気づき変更しました。
carryを導入したことにより、末端に余計なノード(値が0のノード)が発生しなくなりました。
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

dummy と carry を使って、こういうふうに整理するのもいいんですが、ListNode が必要となったら作って、もうあったらそのまま使うということもできますね。(dummy はあくまでも場合分けを減らすためにあるものなので。)

*/
func addTwoNumbers_step3(l1 *ListNode, l2 *ListNode) *ListNode {
dummy := new(ListNode)
curr := dummy
carry := 0
for l1 != nil || l2 != nil || carry != 0 {
sum := carry
if l1 != nil {
sum += l1.Val
l1 = l1.Next
}
if l2 != nil {
sum += l2.Val
l2 = l2.Next
}
curr.Next = &ListNode{Val: sum % 10}
carry = sum / 10
curr = curr.Next
}
return dummy.Next
}