2.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. package main
  2. import (
  3. "fmt"
  4. )
  5. type ListNode struct {
  6. Val int
  7. Next *ListNode
  8. }
  9. func list2str(head *ListNode) string {
  10. curr := head
  11. str := make([]rune, 0)
  12. for curr != nil {
  13. str = append(str, rune(curr.Val+'0'))
  14. curr = curr.Next
  15. }
  16. return string(str)
  17. }
  18. func list2int(head *ListNode) int64 {
  19. beg := head
  20. res := int64(0)
  21. for i := 1; beg != nil; i *= 10 {
  22. res += int64(beg.Val * i)
  23. beg = beg.Next
  24. }
  25. return res
  26. }
  27. func int2list(num int64) *ListNode {
  28. head := &ListNode{int(num % 10), nil}
  29. num /= 10
  30. for tail := head; num != 0; num /= 10 {
  31. tail.Next = &ListNode{int(num % 10), nil}
  32. tail = tail.Next
  33. }
  34. return head
  35. }
  36. // will overflow
  37. func addTwoNumbersOld(l1 *ListNode, l2 *ListNode) *ListNode {
  38. return int2list(list2int(l1) + list2int(l2))
  39. }
  40. /**
  41. * Definition for singly-linked list.
  42. * type ListNode struct {
  43. * Val int
  44. * Next *ListNode
  45. * }
  46. */
  47. // (3->2->1) + (2->1) = (5->3->1), 123 + 12 = 135
  48. func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
  49. // get head of result list
  50. head := &ListNode{(l1.Val + l2.Val) % 10, nil}
  51. remain := int((l1.Val + l2.Val) / 10)
  52. curr := head
  53. l1 = l1.Next
  54. l2 = l2.Next
  55. // while l1 != [] and l2 != [], calculate l1 + l2
  56. for l1 != nil && l2 != nil {
  57. curr.Next = &ListNode{(l1.Val + l2.Val + remain) % 10, nil}
  58. remain = int((l1.Val + l2.Val + remain) / 10)
  59. curr = curr.Next
  60. l1 = l1.Next
  61. l2 = l2.Next
  62. }
  63. // l1 / l2 is nil (l1 == nil, l2 == nil, do nothing)
  64. if l1 != nil {
  65. curr.Next = &ListNode{(l1.Val + remain) % 10, l1.Next}
  66. remain = int((l1.Val + remain) / 10)
  67. curr = curr.Next
  68. } else if l2 != nil {
  69. curr.Next = &ListNode{(l2.Val + remain) % 10, l2.Next}
  70. remain = int((l2.Val + remain) / 10)
  71. curr = curr.Next
  72. }
  73. // add remainder
  74. for remain != 0 {
  75. if curr.Next != nil {
  76. curr.Next.Val += remain
  77. remain = int(curr.Next.Val / 10)
  78. curr.Next.Val %= 10
  79. curr = curr.Next
  80. } else {
  81. curr.Next = &ListNode{remain, nil}
  82. remain = 0
  83. }
  84. }
  85. return head
  86. }
  87. func main() {
  88. l13 := ListNode{3, nil}
  89. l12 := ListNode{2, &l13}
  90. l1 := &ListNode{1, &l12}
  91. l23 := ListNode{9, nil}
  92. l22 := ListNode{9, &l23}
  93. l2 := &ListNode{1, &l22}
  94. fmt.Println(list2str(addTwoNumbers(l1, l2)))
  95. }