def intersection_of_two_linked_list(node1, node2):
	if not node1 or not node2:
		print "Empty linked list"
		return None

	len1 = count_no_of_elements(node1)
	len2 = count_no_of_elements(node2)
	print "len1 :", len1
	print "len2 :", len2

	# move the pointers
	diff = abs(len1 - len2)
	if (len1>len2):
		i = 0
		while (i<diff):
			node1 = node1.next
			i += 1
	else:
		i = 0
		while (i<diff):
			node2 = node2.next
			i += 1

	while (node1 != None and node2 != None):
		print "node1: {0}, node2:{1}".format(node1.contents, node2.contents)
		if node1.contents == node2.contents:
			return node1
		node1 = node1.next
		node2 = node2.next

	return None
def check_length_and_alter(number1, number2):
    #check for size
    length1 = count_no_of_elements(number1)
    length2 = count_no_of_elements(number2)
    if length1 != length2:
        diff = abs(length1-length2)
        if length1> length2:
            #number2 = insert_in_front(number2, diff)
            for i in range(diff):
                number2 = linked_list_insert(number2, 0)
        else:
            #number1 = insert_in_front(number1, diff)
            for i in range(diff):
                number1 = linked_list_insert(number1, 0)
    return number1, number2
def naive_middle_element_in_linked_list(head):
    count = count_no_of_elements(head)
    mid = count/2
    while mid > 0 and head:
        head = head.next
        mid -= 1
    return head
def method_1_reverse_linked_list_after_k(head, k):
    temp_head = head
    length = count_no_of_elements(head)
    if k > length:
        print "Wrong input: k value greater than length"
        return
    if not head:
        print "list is empty"
        return
    count = 0
    prev_head = None
    while temp_head and count < k:
        prev_head = temp_head
        temp_head = temp_head.next
        count += 1
    print "\n head.contents:{0}".format(head)
    print "\n prev head contents:{0}".format(prev_head)
    print "\noriginal list: "
    print_linked_list_contents(head)

    reversed_k_head = reverse_linked_list(temp_head)
    print "\n reversed_k_head list:"
    print_linked_list_contents(reversed_k_head)

    prev_head.next = reverse_linked_list
    print "new::"
def check_if_both_linked_list_are_same(head1, head2):
    if not head1 or not head2:
        print "Empty linked list."
        return False

    # Actually this is not needed.
    if count_no_of_elements(head1) != count_no_of_elements(head2):
        print "Number of nodes do not match!!!"
        return False

    while head1 and head2:
        if head1.contents != head2.contents:
            print "They do not look the same. Sorry"
            return False
        head1 = head1.next
        head2 = head2.next
    print "Both are the same."
    return True

def decimal_equivalent(head):
    result = 0
    while head != None:
        result = (result << 1) + head.contents
        head = head.next
    return result


if __name__ == "__main__":
    array1 = [0, 0, 0, 1, 1, 0, 0, 1, 0]
    header1 = generate_linked_list_with_values(array1)
    print "print_linked_list_contents: "
    print_linked_list_contents(header1)
    print "count_no_of_elements : {0}".format(count_no_of_elements(header1))
    print "decimal_equivalent_based_on_length : {0}".format(
        decimal_equivalent_based_on_length(header1, count_no_of_elements(header1))
    )
    print "decimal_equivalent : {0}".format(decimal_equivalent(header1))

    array2 = [1, 0, 0]
    header2 = generate_linked_list_with_values(array2)
    print "print_linked_list_contents: "
    print_linked_list_contents(header2)
    print "count_no_of_elements : {0}".format(count_no_of_elements(header2))
    print "decimal_equivalent_based_on_length : {0}".format(
        decimal_equivalent_based_on_length(header2, count_no_of_elements(header2))
    )
    print "decimal_equivalent : {0}".format(decimal_equivalent(header2))