def sum_lists(list1, list2):
    current_l1_node = list1.head()
    current_l2_node = list2.head()
    rest = 0
    sum_list = SingleLinkedList.new()
    while current_l1_node is not None or current_l2_node is not None:
        l1_digit = current_l1_node.data() if current_l1_node else 0
        l2_digit = current_l2_node.data() if current_l2_node else 0
        sum = l1_digit + l2_digit + rest
        if is_two_digit_number(sum):
            rest = sum / 10
            sum %= 10
        else:
            rest = 0
        if at_both_ends(current_l1_node, current_l2_node):
            sum_list.insert_data_at_beggining(sum)
            if rest > 0:
                sum_list.insert_data_at_beggining(rest)
            break
        else:
            sum_list.insert_data_at_beggining(sum)
        current_l1_node = current_l1_node.next_element() if current_l1_node else None
        current_l2_node = current_l2_node.next_element() if current_l2_node else None
    return sum_list
            sum %= 10
        else:
            rest = 0
        if at_both_ends(current_l1_node, current_l2_node):
            sum_list.insert_data_at_beggining(sum)
            if rest > 0:
                sum_list.insert_data_at_beggining(rest)
            break
        else:
            sum_list.insert_data_at_beggining(sum)
        current_l1_node = current_l1_node.next_element() if current_l1_node else None
        current_l2_node = current_l2_node.next_element() if current_l2_node else None
    return sum_list

# TEST 1
list1 = SingleLinkedList.new()
list1.append_from_iterable(iterable=[1, 2, 3])
list2 = SingleLinkedList.new()
list2.append_from_iterable(iterable=[4, 1, 6])
new_list = sum_lists(list1, list2)
new_list.show()

# TEST 2
list1 = SingleLinkedList.new()
list1.append_from_iterable(iterable=[6, 4, 8])
list2 = SingleLinkedList.new()
list2.append_from_iterable(iterable=[3, 1, 9])
new_list = sum_lists(list1, list2)
new_list.show()

# TEST 3
    current_list1_node = list1.head()
    while current_list1_node is not None:
        ids_hashset.add(id(current_list1_node))
        current_list1_node = current_list1_node.next_element()
    return ids_hashset


def intersection(list1, list2):
    validate_input(list1, list2)
    ids_hashset = make_ids_hashset_from(list1)
    current_list2_node = list2.head()
    while current_list2_node is not None:
        if id(current_list2_node) in ids_hashset:
            return True
        current_list2_node = current_list2_node.next_element()
    return False


end_node = SingleLinkedNode.new(data=5, next_element=None)
third_node = SingleLinkedNode(data=3, next_element=None)
second_node = SingleLinkedNode.new(data=2, next_element=third_node)
first_node = SingleLinkedNode.new(data=1, next_element=second_node)
l1 = SingleLinkedList.new()
l2 = SingleLinkedList.new()
l1.append_node(first_node)
l1.append_node(second_node)
l1.append_node(third_node)
l2.append_node(end_node)
l2.append_node(first_node)
assert intersection(l1, l2)