Skip to content

Commit 93db35a

Browse files
committed
Improve solution for Add two numbers: Make it a one pass solution, rather than ~ 4 passes
1 parent 3429569 commit 93db35a

File tree

1 file changed

+59
-69
lines changed

1 file changed

+59
-69
lines changed

add_two_numbers.go

Lines changed: 59 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -2,94 +2,80 @@ package main
22

33
import (
44
"fmt"
5-
"strconv"
6-
"strings"
75
)
86

97
type ListNode struct {
108
Val int
119
Next *ListNode
1210
}
1311

14-
func walk (l *ListNode, a *string) {
15-
v := l.Val
16-
*a = *a + fmt.Sprintf("%d", v)
17-
18-
if l.Next != nil {
19-
walk(l.Next, a)
20-
}
21-
}
22-
23-
func extendLinkedList(ln *ListNode, acc []string, ci int) {
24-
cmp := len(acc) - ci - 1
25-
iSum, _ := strconv.ParseInt(acc[cmp], 10, 32)
26-
ln.Val = int(iSum)
27-
28-
if cmp != 0 {
29-
next := ListNode{}
30-
ln.Next = &next
31-
extendLinkedList(ln.Next, acc, ci + 1)
32-
}
33-
}
34-
3512
func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
36-
acc1 := ""
37-
acc2 := ""
13+
resNode := &ListNode{}
14+
curResNode := resNode
15+
curNode1 := l1
16+
curNode2 := l2
17+
carry := 0
3818

39-
walk(l1, &acc1)
40-
walk(l2, &acc2)
19+
for {
20+
var d1, d2 int
21+
if curNode1 != nil {
22+
d1 = curNode1.Val
23+
curNode1 = curNode1.Next
24+
}
4125

42-
lng := acc1
43-
srt := acc2
44-
if len(acc1) < len(acc2) {
45-
lng = acc2
46-
srt = acc1
47-
}
26+
if curNode2 != nil {
27+
d2 = curNode2.Val
28+
curNode2 = curNode2.Next
29+
}
4830

49-
sumStr := ""
50-
carry := 0
51-
for i := 0; i <= len(lng); i ++ {
52-
if i == len(lng) {
53-
if carry > 0 {
54-
sumStr = fmt.Sprintf("%d", carry) + sumStr
55-
}
56-
} else {
57-
var vs, vl string
58-
59-
if i < len(srt) {
60-
vs = string(srt[i])
61-
}
62-
63-
vl = string(lng[i])
64-
ds, _ := strconv.Atoi(vs)
65-
dl, _ := strconv.Atoi(vl)
66-
67-
sI := ds + dl + carry
68-
carry = sI / 10
69-
sI = sI % 10
70-
71-
fmt.Printf("\n Index: %d ::: short %d + long %d ==> %d;; carry: %d", i, ds, dl, sI, carry)
72-
sumStr = fmt.Sprintf("%d", sI) + sumStr
73-
}
74-
}
31+
dSum := d1 + d2 + carry
32+
carry = dSum / 10
33+
dSum = dSum % 10
7534

76-
fmt.Printf("\n FINAL SUM::: %s", sumStr)
77-
sumSl := strings.Split(sumStr, "")
35+
fmt.Printf("\nNode1 %d + Node2 %d ==> %d;; carry: %d", d1, d2, dSum, carry)
7836

79-
lnSum := ListNode{}
80-
extendLinkedList(&lnSum, sumSl, 0)
37+
curResNode.Val = dSum
8138

82-
return &lnSum
39+
if curNode1 == nil && curNode2 == nil {
40+
if carry > 0 {
41+
carryNode := ListNode{
42+
Val: carry,
43+
Next: nil,
44+
}
45+
curResNode.Next = &carryNode
46+
}
47+
48+
break
49+
}
50+
51+
nextNode := ListNode{}
52+
curResNode.Next = &nextNode
53+
curResNode = curResNode.Next
54+
}
55+
56+
return resNode
8357
}
8458

85-
func extendTestCaseLinkedList(ln *ListNode, acc []int, ci int) {
59+
// populateLinkedList: Helper function to build LinkedList for testCases
60+
func populateLinkedList(ln *ListNode, acc []int, ci int) {
8661
iSum := acc[ci]
8762
ln.Val = int(iSum)
8863

8964
if ci < len(acc) - 1 {
9065
next := ListNode{}
9166
ln.Next = &next
92-
extendTestCaseLinkedList(ln.Next, acc, ci + 1)
67+
populateLinkedList(ln.Next, acc, ci + 1)
68+
}
69+
}
70+
71+
// walk: Helper function to walk a Linkedlist and populate build a
72+
// string representation for it
73+
func walk (l *ListNode, a *string) {
74+
v := l.Val
75+
*a = *a + fmt.Sprintf("%d", v)
76+
77+
if l.Next != nil {
78+
walk(l.Next, a)
9379
}
9480
}
9581

@@ -99,8 +85,12 @@ func main() {
9985
test2 := []int{5,6,4}
10086

10187
var listNode1, listNode2 ListNode
102-
extendTestCaseLinkedList(&listNode1, test1, 0)
103-
extendTestCaseLinkedList(&listNode2, test2, 0)
88+
populateLinkedList(&listNode1, test1, 0)
89+
populateLinkedList(&listNode2, test2, 0)
90+
91+
resNode := addTwoNumbers(&listNode1, &listNode2)
92+
resStr := ""
93+
walk(resNode, &resStr)
10494

105-
addTwoNumbers(&listNode1, &listNode2)
95+
fmt.Printf("\nRESULT::: %s \n", resStr)
10696
}

0 commit comments

Comments
 (0)