2.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. package main
  2. /**
  3. * Definition for singly-linked list.
  4. * type ListNode struct {
  5. * Val int
  6. * Next *ListNode
  7. * }
  8. */
  9. // (3->2->1) + (2->1) = (5->3->1), 123 + 12 = 135
  10. func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
  11. // get head of result list
  12. head := &ListNode{(l1.Val + l2.Val) % 10, nil}
  13. remain := int((l1.Val + l2.Val) / 10)
  14. curr := head
  15. l1 = l1.Next
  16. l2 = l2.Next
  17. // while l1 != [] and l2 != [], calculate l1 + l2
  18. for l1 != nil && l2 != nil {
  19. curr.Next = &ListNode{(l1.Val + l2.Val + remain) % 10, nil}
  20. remain = int((l1.Val + l2.Val + remain) / 10)
  21. curr = curr.Next
  22. l1 = l1.Next
  23. l2 = l2.Next
  24. }
  25. // l1 / l2 is nil
  26. if l1 != nil {
  27. curr.Next = &ListNode{(l1.Val + remain) % 10, l1.Next}
  28. remain = int((l1.Val + remain) / 10)
  29. } else if l2 != nil {
  30. curr.Next = &ListNode{(l2.Val + remain) % 10, l2.Next}
  31. remain = int((l2.Val + remain) / 10)
  32. }
  33. curr = curr.Next
  34. // add remainder
  35. for remain != 0 {
  36. if curr.Next != nil {
  37. curr.Next.Val += remain
  38. remain = int(curr.Next.Val / 10)
  39. curr.Next.Val %= 10
  40. curr = curr.Next
  41. } else {
  42. curr.Next = &ListNode{remain, nil}
  43. remain = 0
  44. }
  45. }
  46. return head
  47. }