2. Add Two Numbers
# O(max(n, m)) time || O(1) space
def add_two_numbers(self, l1: Optional[ListNode], l2: Optional[ListNode]) -> Optional[ListNode]:
    sentinel = ListNode()
    prev = sentinel
    hold = 0
    while l1 or l2:
        curr_sum = 0
        if l1:
            curr_sum, l1 = curr_sum + l1.val, l1.next
        if l2:
            curr_sum, l2 = curr_sum + l2.val, l2.next
        curr_sum += hold
        prev.next, hold = ListNode(curr_sum % 10), curr_sum // 10
        prev = prev.next
    if hold:
        prev.next = ListNode(hold)
    return sentinel.next
calculate sum in column like in school. use on hold var. 
sum % 10 is value, sum // 10 is in memory. 
it’s better to traverse while l1 or l2: to avoid building list from left part of list.