summaryrefslogtreecommitdiff
path: root/reversenumber
diff options
context:
space:
mode:
Diffstat (limited to 'reversenumber')
-rw-r--r--reversenumber/main.go118
1 files changed, 118 insertions, 0 deletions
diff --git a/reversenumber/main.go b/reversenumber/main.go
new file mode 100644
index 0000000..1a4f5ba
--- /dev/null
+++ b/reversenumber/main.go
@@ -0,0 +1,118 @@
+package main
+
+import "fmt"
+
+type ListNode struct {
+ Val int
+ Next *ListNode
+}
+
+func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
+ r1 := &ListNode{
+ Val: l1.Val,
+ }
+ r2 := &ListNode{
+ Val: l2.Val,
+ }
+
+ l1l := 0
+ l2l := 0
+
+ for {
+ if l1 != nil {
+ l1l += 1
+ r1n := r1
+ r1 = &ListNode{
+ Val: l1.Val,
+ Next: r1n,
+ }
+ l1 = l1.Next
+ }
+
+ if l2 != nil {
+ l2l += 1
+ r2n := r2
+ r2 = &ListNode{
+ Val: l2.Val,
+ Next: r2n,
+ }
+ l2 = l2.Next
+ }
+
+ if l1 == nil && l2 == nil {
+ break
+ }
+ }
+
+ var output, input *ListNode
+ if l1l > l2l {
+ output = r1
+ input = r2
+ } else {
+ output = r2
+ input = r2
+ }
+
+ carry := 0
+ var prev *ListNode
+ for {
+ sum := output.Val + carry
+ if input != nil {
+ sum = sum + input.Val
+ input = input.Next
+ }
+
+ carry = sum / 10
+ next := output.Next
+ output.Val = sum % 10
+ output.Next = prev
+ prev = output
+
+ if next == nil {
+ break
+ }
+ output = next
+ }
+
+ return output
+}
+
+func makeList(list []int) *ListNode {
+ output := &ListNode{
+ Val: list[0],
+ Next: nil,
+ }
+ current := output
+ for _, n := range list[1:] {
+ node := &ListNode{
+ Val: n,
+ }
+ current.Next = node
+ current = node
+ }
+
+ return output
+}
+
+func printList(node *ListNode) {
+ for {
+ if node == nil {
+ break
+ }
+
+ fmt.Print(node.Val)
+ node = node.Next
+ }
+ fmt.Println()
+}
+
+func main() {
+ // Input: l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
+ // Output: [8,9,9,9,0,0,0,1]
+ l1 := makeList([]int{9, 9, 9, 9, 9, 9, 9})
+ l2 := makeList([]int{9, 9, 9, 9})
+ printList(l1)
+ printList(l2)
+
+ printList(addTwoNumbers(l1, l2))
+}