@@ -2,94 +2,80 @@ package main
2
2
3
3
import (
4
4
"fmt"
5
- "strconv"
6
- "strings"
7
5
)
8
6
9
7
type ListNode struct {
10
8
Val int
11
9
Next * ListNode
12
10
}
13
11
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
-
35
12
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
38
18
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
+ }
41
25
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
+ }
48
30
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
75
34
76
- fmt .Printf ("\n FINAL SUM::: %s" , sumStr )
77
- sumSl := strings .Split (sumStr , "" )
35
+ fmt .Printf ("\n Node1 %d + Node2 %d ==> %d;; carry: %d" , d1 , d2 , dSum , carry )
78
36
79
- lnSum := ListNode {}
80
- extendLinkedList (& lnSum , sumSl , 0 )
37
+ curResNode .Val = dSum
81
38
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
83
57
}
84
58
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 ) {
86
61
iSum := acc [ci ]
87
62
ln .Val = int (iSum )
88
63
89
64
if ci < len (acc ) - 1 {
90
65
next := ListNode {}
91
66
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 )
93
79
}
94
80
}
95
81
@@ -99,8 +85,12 @@ func main() {
99
85
test2 := []int {5 ,6 ,4 }
100
86
101
87
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 )
104
94
105
- addTwoNumbers ( & listNode1 , & listNode2 )
95
+ fmt . Printf ( " \n RESULT::: %s \n " , resStr )
106
96
}
0 commit comments