|
@@ -0,0 +1,47 @@
|
|
|
+/**
|
|
|
+ * Definition for singly-linked list.
|
|
|
+ * type ListNode struct {
|
|
|
+ * Val int
|
|
|
+ * Next *ListNode
|
|
|
+ * }
|
|
|
+ */
|
|
|
+func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
|
|
|
+ if l1 == nil {
|
|
|
+ return l2
|
|
|
+ } else if l2 == nil {
|
|
|
+ return l1
|
|
|
+ }
|
|
|
+ m, n := 0, 0
|
|
|
+ for cur := l1; cur != nil; cur, m = cur.Next, m+1 {
|
|
|
+ }
|
|
|
+ for cur := l2; cur != nil; cur, n = cur.Next, n+1 {
|
|
|
+ }
|
|
|
+ var li *ListNode
|
|
|
+ var rem int
|
|
|
+ if m < n {
|
|
|
+ li, rem = addRecurse(l2, l1, n, m, 0)
|
|
|
+ } else {
|
|
|
+ li, rem = addRecurse(l1, l2, m, n, 0)
|
|
|
+ }
|
|
|
+ if rem != 0 {
|
|
|
+ li = &ListNode{rem, li}
|
|
|
+ }
|
|
|
+ return li
|
|
|
+}
|
|
|
+
|
|
|
+func addRecurse(l1, l2 *ListNode, m, n, i int) (*ListNode, int) { // n <= m
|
|
|
+ if i == m {
|
|
|
+ return nil, 0
|
|
|
+ }
|
|
|
+ a, b := l1.Val, 0
|
|
|
+ next1, next2 := l1.Next, l2
|
|
|
+ if m-n <= i {
|
|
|
+ b = l2.Val
|
|
|
+ next2 = l2.Next
|
|
|
+ }
|
|
|
+ li, rem := addRecurse(next1, next2, m, n, i+1)
|
|
|
+ c := a + b + rem
|
|
|
+ c, rem = c%10, c/10
|
|
|
+ li = &ListNode{c, li}
|
|
|
+ return li, rem
|
|
|
+}
|