diff options
Diffstat (limited to 'reversenumber/main.go')
| -rw-r--r-- | reversenumber/main.go | 118 |
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)) +} |
