while l1 < l2:
            zero = ll.ListNode(0)
            zero.next = head1
            head1 = zero
            l1 += 1
    #print "%d,%d" % (l1,l2)
    ll.print_list(head1)
    ll.print_list(head2)
    res,flag = rec(head1,head2,l1-1)
    if flag == 1:
        return res+10**l1
    else:
        return res

def rec(head1,head2,i):
    if i == 0:
        tmp = head1.val+head2.val
        return (tmp%10,tmp/10)
    res = 0
    tmp = head1.val + head2.val
    head1 = head1.next
    head2 = head2.next
    other,flag = rec(head1,head2,i-1)
    return ((tmp+flag)%10*(10**i)+other,tmp/10)


head1 = ll.create_list([1,2,1,7,1,6])
head2 = ll.create_list([5,9,2])
ll.print_list(head1)
ll.print_list(head2)
print add2(head1,head2)
import mylist as ll
import pdb


# check if a list is a palidrome
# O(n2) solution

def isPalidrome(head):
    if not head or not head.next:
        return True
    size = ll.get_length(head)
    return rec(head,size-1)


def rec(head,size):
    if size < 1:
        return True
    a = head
    i = 0
    for i in range(size):
        a = a.next
    return head.val == a.val and rec(head.next,size-2)
   

head1 = ll.create_list([1,2,2])
#head2 = ll.create_list([5,9,2])
ll.print_list(head1)
#ll.print_list(head2)
print isPalidrome(head1)
import mylist as ll

# find the kth element in the list


def return_kth(head, k):
    size = ll.get_length(head)
    if not head or k > size:
        print "invalid input"
        return 0
    # far = size-k+1
    start = head
    end = head
    for i in range(k):
        end = end.next
    while end:
        start = start.next
        end = end.next
    return start.val


head = ll.create_list([1, 2, 3, 4, 5])
ll.print_list(head)
print return_kth(head, 2)