123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- package main
- /* type ListNode struct {
- Val int
- Next *ListNode
- }
- */
- /* func list2str(head *ListNode) string {
- curr := head
- str := make([]rune, 0)
- for curr != nil {
- str = append(str, rune(curr.Val+'0'))
- curr = curr.Next
- }
- return string(str)
- }
- */
- func list2int(head *ListNode) int64 {
- beg := head
- res := int64(0)
- for i := 1; beg != nil; i *= 10 {
- res += int64(beg.Val * i)
- beg = beg.Next
- }
- return res
- }
- func int2list(num int64) *ListNode {
- head := &ListNode{int(num % 10), nil}
- num /= 10
- for tail := head; num != 0; num /= 10 {
- tail.Next = &ListNode{int(num % 10), nil}
- tail = tail.Next
- }
- return head
- }
- // will overflow
- func addTwoNumbersOld(l1 *ListNode, l2 *ListNode) *ListNode {
- return int2list(list2int(l1) + list2int(l2))
- }
- /**
- * Definition for singly-linked list.
- * type ListNode struct {
- * Val int
- * Next *ListNode
- * }
- */
- // (3->2->1) + (2->1) = (5->3->1), 123 + 12 = 135
- func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {
- // get head of result list
- head := &ListNode{(l1.Val + l2.Val) % 10, nil}
- remain := int((l1.Val + l2.Val) / 10)
- curr := head
- l1 = l1.Next
- l2 = l2.Next
- // while l1 != [] and l2 != [], calculate l1 + l2
- for l1 != nil && l2 != nil {
- curr.Next = &ListNode{(l1.Val + l2.Val + remain) % 10, nil}
- remain = int((l1.Val + l2.Val + remain) / 10)
- curr = curr.Next
- l1 = l1.Next
- l2 = l2.Next
- }
- // l1 / l2 is nil (l1 == nil, l2 == nil, do nothing)
- if l1 != nil {
- curr.Next = &ListNode{(l1.Val + remain) % 10, l1.Next}
- remain = int((l1.Val + remain) / 10)
- curr = curr.Next
- } else if l2 != nil {
- curr.Next = &ListNode{(l2.Val + remain) % 10, l2.Next}
- remain = int((l2.Val + remain) / 10)
- curr = curr.Next
- }
- // add remainder
- for remain != 0 {
- if curr.Next != nil {
- curr.Next.Val += remain
- remain = int(curr.Next.Val / 10)
- curr.Next.Val %= 10
- curr = curr.Next
- } else {
- curr.Next = &ListNode{remain, nil}
- remain = 0
- }
- }
- return head
- }
- /* func main() {
- l13 := ListNode{3, nil}
- l12 := ListNode{2, &l13}
- l1 := &ListNode{1, &l12}
- l23 := ListNode{9, nil}
- l22 := ListNode{9, &l23}
- l2 := &ListNode{1, &l22}
- fmt.Println(list2str(addTwoNumbers(l1, l2)))
- } */
|