Skip to content

Commit

Permalink
day 127: sum reversed linked list digits
Browse files Browse the repository at this point in the history
  • Loading branch information
vaskoz committed Dec 29, 2018
1 parent 4418d81 commit 35e1040
Show file tree
Hide file tree
Showing 2 changed files with 108 additions and 0 deletions.
39 changes: 39 additions & 0 deletions day127/problem.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package day127

// RevLLNum represents a reversed linked list of digits.
type RevLLNum struct {
Digit int
Next *RevLLNum
}

// SumRevLLNum returns the sum of two RevLLNum as a new RevLLNum.
func SumRevLLNum(first, second *RevLLNum) *RevLLNum {
var carryOne bool
result := &RevLLNum{}
current := result
for first != nil || second != nil {
current.Next = &RevLLNum{}
current = current.Next
var sum int
if first == nil {
sum = second.Digit
second = second.Next
} else if second == nil {
sum = first.Digit
first = first.Next
} else {
sum = first.Digit + second.Digit
first = first.Next
second = second.Next
}
if carryOne {
sum++
}
carryOne = sum > 9
current.Digit = sum % 10
}
if carryOne {
current.Next = &RevLLNum{1, nil}
}
return result.Next
}
69 changes: 69 additions & 0 deletions day127/problem_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package day127

import (
"strconv"
"strings"
"testing"
)

var testcases = []struct {
first, second, sum *RevLLNum
}{
{&RevLLNum{9, &RevLLNum{9, nil}},
&RevLLNum{5, &RevLLNum{2, nil}},
&RevLLNum{4, &RevLLNum{2, &RevLLNum{1, nil}}}},
{&RevLLNum{9, &RevLLNum{9, nil}},
nil,
&RevLLNum{9, &RevLLNum{9, nil}}},
{nil,
&RevLLNum{9, &RevLLNum{9, nil}},
&RevLLNum{9, &RevLLNum{9, nil}}},
{&RevLLNum{9, &RevLLNum{9, &RevLLNum{9, &RevLLNum{9, nil}}}},
&RevLLNum{1, nil},
&RevLLNum{0, &RevLLNum{0, &RevLLNum{0, &RevLLNum{0, &RevLLNum{1, nil}}}}}},
}

func TestSumRevLLNum(t *testing.T) {
t.Parallel()
for tcid, tc := range testcases {
if result := SumRevLLNum(tc.first, tc.second); !equal(result, tc.sum) {
t.Errorf("TCID%d does not match expected. Got %v expected %v",
tcid, String(result), String(tc.sum))
}
}
}

func BenchmarkSumRevLLNum(b *testing.B) {
for i := 0; i < b.N; i++ {
for _, tc := range testcases {
SumRevLLNum(tc.first, tc.second)
}
}
}

func equal(a, b *RevLLNum) bool {
if a == nil && b == nil {
return true
} else if a == nil && b != nil {
return false
} else if a != nil && b == nil {
return false
}
for a != nil && b != nil {
if a.Digit != b.Digit {
return false
}
a = a.Next
b = b.Next
}
return a == b
}

func String(a *RevLLNum) string {
var sb strings.Builder
for a != nil {
sb.WriteString(strconv.Itoa(a.Digit))
a = a.Next
}
return sb.String()
}

0 comments on commit 35e1040

Please sign in to comment.