From ae0f8630708be368d24c8f233f78e73971d937bb Mon Sep 17 00:00:00 2001 From: Hugo Salinas Date: Thu, 15 Feb 2024 21:55:12 -0500 Subject: [PATCH] updates to add 2 numbers --- add_two_numbers_2/solution.go | 213 ++++++++++++++++++----------- add_two_numbers_2/solution_test.go | 4 +- go.mod | 8 +- 3 files changed, 141 insertions(+), 84 deletions(-) diff --git a/add_two_numbers_2/solution.go b/add_two_numbers_2/solution.go index 47ad347..c3e7a47 100644 --- a/add_two_numbers_2/solution.go +++ b/add_two_numbers_2/solution.go @@ -1,103 +1,154 @@ package add_two_numbers_2 import ( + "slices" + "strings" + "github.com/austingebauer/go-leetcode/structures" - "math/big" + // "math/big" + + "strconv" ) func addTwoNumbers(l1 *structures.ListNode, l2 *structures.ListNode) *structures.ListNode { - num1 := depthFirstNum(l1) - num2 := depthFirstNum(l2) - - var sum big.Int - sum.Add(num1, num2) + l1NumString := "" + l2NumString := "" - // single digit sum - if len(sum.String()) == 1 { - return &structures.ListNode{ - Val: int(sum.Int64()), - Next: nil, + for true { + l1NumString = strconv.Itoa(l1.Val) + l1NumString + if l1.Next == nil { + break } + l1 = l1.Next } - var sumList *structures.ListNode - var current *structures.ListNode - - for sum.String() != "0" { - var lastDigit big.Int - lastDigit.Mod(&sum, big.NewInt(10)) - - node := &structures.ListNode{ - Val: int(lastDigit.Int64()), - Next: nil, + for true { + l2NumString = strconv.Itoa(l2.Val) + l2NumString + if l2.Next == nil { + break } - if sumList == nil { - sumList = node - } - if current == nil { - current = node - } else { - current.Next = node - current = current.Next - } - - sum.Div(&sum, big.NewInt(10)) + l2 = l2.Next } - return sumList -} + num1, _ := strconv.Atoi(l1NumString) + num2, _ := strconv.Atoi(l2NumString) + numSum := strconv.Itoa(num1 + num2) -func depthFirstNum(l *structures.ListNode) *big.Int { - if l == nil { - return big.NewInt(0) - } + numSumList := strings.Split(numSum, "") + slices.Reverse(numSumList) - v := depthFirstNum(l.Next) - return v.Mul(v, big.NewInt(10)).Add(v, big.NewInt(int64(l.Val))) + numLinkedList := &structures.ListNode{} + numLinkedList = addNode(numLinkedList, 0, numSumList) + + return numLinkedList } -func addTwoNumbers2(l1 *structures.ListNode, l2 *structures.ListNode) *structures.ListNode { - carry := 0 - sumList := &structures.ListNode{ - Val: 0, +func addNode(nodeList *structures.ListNode, index int, numList []string) *structures.ListNode { + currentValue, _ := strconv.Atoi(numList[index]) + nodeList = &structures.ListNode{ + Val: currentValue, Next: nil, } - frontSumList := sumList - - for l1 != nil || l2 != nil { - // calculate sum and carry values - l1Val := 0 - l2Val := 0 - if l1 != nil { - l1Val = l1.Val - l1 = l1.Next - } - if l2 != nil { - l2Val = l2.Val - l2 = l2.Next - } - - sum := l1Val + l2Val + carry - carry = sum / 10 - sumList.Val = sum % 10 - - // no more list to process, but carry is not 0 - if l1 == nil && l2 == nil && carry > 0 { - sumList.Next = &structures.ListNode{ - Val: carry, - Next: nil, - } - } - - // one or both lists still can be processed - if l1 != nil || l2 != nil { - sumList.Next = &structures.ListNode{ - Val: 0, - Next: nil, - } - sumList = sumList.Next - } + if index < len(numList)-1 { + index++ + nodeList.Next = addNode(nodeList, index, numList) } - - return frontSumList + return nodeList } + +// func addTwoNumbers(l1 *structures.ListNode, l2 *structures.ListNode) *structures.ListNode { +// num1 := depthFirstNum(l1) +// num2 := depthFirstNum(l2) + +// var sum big.Int +// sum.Add(num1, num2) + +// // single digit sum +// if len(sum.String()) == 1 { +// return &structures.ListNode{ +// Val: int(sum.Int64()), +// Next: nil, +// } +// } + +// var sumList *structures.ListNode +// var current *structures.ListNode + +// for sum.String() != "0" { +// var lastDigit big.Int +// lastDigit.Mod(&sum, big.NewInt(10)) + +// node := &structures.ListNode{ +// Val: int(lastDigit.Int64()), +// Next: nil, +// } +// if sumList == nil { +// sumList = node +// } +// if current == nil { +// current = node +// } else { +// current.Next = node +// current = current.Next +// } + +// sum.Div(&sum, big.NewInt(10)) +// } + +// return sumList +// } + +// func depthFirstNum(l *structures.ListNode) *big.Int { +// if l == nil { +// return big.NewInt(0) +// } + +// v := depthFirstNum(l.Next) +// return v.Mul(v, big.NewInt(10)).Add(v, big.NewInt(int64(l.Val))) +// } + +// func addTwoNumbers2(l1 *structures.ListNode, l2 *structures.ListNode) *structures.ListNode { +// carry := 0 +// sumList := &structures.ListNode{ +// Val: 0, +// Next: nil, +// } +// frontSumList := sumList + +// for l1 != nil || l2 != nil { +// // calculate sum and carry values +// l1Val := 0 +// l2Val := 0 +// if l1 != nil { +// l1Val = l1.Val +// l1 = l1.Next +// } +// if l2 != nil { +// l2Val = l2.Val +// l2 = l2.Next +// } + +// sum := l1Val + l2Val + carry +// carry = sum / 10 +// sumList.Val = sum % 10 + +// // no more list to process, but carry is not 0 +// if l1 == nil && l2 == nil && carry > 0 { +// sumList.Next = &structures.ListNode{ +// Val: carry, +// Next: nil, +// } +// } + +// // one or both lists still can be processed +// if l1 != nil || l2 != nil { +// sumList.Next = &structures.ListNode{ +// Val: 0, +// Next: nil, +// } +// sumList = sumList.Next +// } +// } + +// return frontSumList +// } diff --git a/add_two_numbers_2/solution_test.go b/add_two_numbers_2/solution_test.go index 366b8c0..c78101c 100644 --- a/add_two_numbers_2/solution_test.go +++ b/add_two_numbers_2/solution_test.go @@ -1,9 +1,10 @@ package add_two_numbers_2 import ( + "testing" + "github.com/austingebauer/go-leetcode/structures" "github.com/stretchr/testify/assert" - "testing" ) func Test_addTwoNumbers(t *testing.T) { @@ -96,7 +97,6 @@ func Test_addTwoNumbers(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { assert.Equal(t, tt.want, addTwoNumbers(tt.args.l1, tt.args.l2)) - assert.Equal(t, tt.want, addTwoNumbers2(tt.args.l1, tt.args.l2)) }) } } diff --git a/go.mod b/go.mod index 24d7208..eccc065 100644 --- a/go.mod +++ b/go.mod @@ -1,5 +1,11 @@ module github.com/austingebauer/go-leetcode -go 1.14 +go 1.18 require github.com/stretchr/testify v1.5.1 + +require ( + github.com/davecgh/go-spew v1.1.0 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + gopkg.in/yaml.v2 v2.2.2 // indirect +)