445.add-two-numbers-ii.go 892 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. /**
  2. * Definition for singly-linked list.
  3. * type ListNode struct {
  4. * Val int
  5. * Next *ListNode
  6. * }
  7. */
  8. func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
  9. if l1 == nil {
  10. return l2
  11. } else if l2 == nil {
  12. return l1
  13. }
  14. m, n := 0, 0
  15. for cur := l1; cur != nil; cur, m = cur.Next, m+1 {
  16. }
  17. for cur := l2; cur != nil; cur, n = cur.Next, n+1 {
  18. }
  19. var li *ListNode
  20. var rem int
  21. if m < n {
  22. li, rem = addRecurse(l2, l1, n, m, 0)
  23. } else {
  24. li, rem = addRecurse(l1, l2, m, n, 0)
  25. }
  26. if rem != 0 {
  27. li = &ListNode{rem, li}
  28. }
  29. return li
  30. }
  31. func addRecurse(l1, l2 *ListNode, m, n, i int) (*ListNode, int) { // n <= m
  32. if i == m {
  33. return nil, 0
  34. }
  35. a, b := l1.Val, 0
  36. next1, next2 := l1.Next, l2
  37. if m-n <= i {
  38. b = l2.Val
  39. next2 = l2.Next
  40. }
  41. li, rem := addRecurse(next1, next2, m, n, i+1)
  42. c := a + b + rem
  43. c, rem = c%10, c/10
  44. li = &ListNode{c, li}
  45. return li, rem
  46. }