dengxinyi před 6 roky
rodič
revize
52fbb39418
1 změnil soubory, kde provedl 47 přidání a 0 odebrání
  1. 47 0
      medium/445.add-two-numbers-ii.go

+ 47 - 0
medium/445.add-two-numbers-ii.go

@@ -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
+}