给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。

如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。

您可以假设除了数字 0 之外,这两个数都不会以 0 开头。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-two-numbers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
# Definition for singly-linked list.
# class ListNode
#     attr_accessor :val, :next
#     def initialize(val)
#         @val = val
#         @next = nil
#     end
# end

# @param {ListNode} l1
# @param {ListNode} l2
# @return {ListNode}
# def add_two_numbers(l1, l2)
#     i = get_num([], l1) + get_num([], l2)
#     node_array = i.to_s.chars.reverse
#     root_node = ListNode.new(node_array[0].to_i)
#     current_node = root_node
#     node_array[1..-1].each do |num|
#        current_node.next = ListNode.new(num.to_i)
#        current_node = current_node.next
#     end
#     root_node
# end


# def get_num flat, list
#     flat << list.val
#     if list.next == nil
#         return flat.reverse.join.to_i
#     else
#         get_num(flat, list.next)    
#     end
# end

def add_two_numbers(l1, l2)
    sum = (l1.val || 0) + (l2.val || 0)
    carry = sum >= 10      
    result_list = ListNode.new(carry ? sum - 10 : sum)
    current_node = result_list
    
    l1 = l1.next
    l2 = l2.next

    while l1 || l2
        sum = (l1&.val || 0) + (l2&.val || 0)
        sum += 1 if carry
        carry = sum >= 10         
        current_node.next = ListNode.new(carry ? sum - 10 : sum)
        current_node = current_node.next

        l1 = l1&.next
        l2 = l2&.next 
    end

    current_node.next = ListNode.new(1) if carry
    result_list
end