//get length of a LinkedList
		private static int getLength(ListNode head)
		{
			int l = 0;
			while (head.next != null) {
				l++;
				head = head.next;
			}
			return l;
		}
		//up level public method
		public static ListNode getIntersection(ListNode head1, ListNode head2)
		{
			int l1 = getLength (head1);
			int l2 = getLength (head2);
			if (l1 > l2) {
				int d = l1 - l2;
				return getIntersectionHelper (d, head1, head2);
			} else {
				int d = l2 - l1;
				return getIntersectionHelper (d, head2, head1);
			}
				
		}
		//get intersection using two Linkedlist and the length difference
		private static ListNode getIntersectionHelper(int d, ListNode head1, ListNode head2)
		{
			for (int i = 0; i < d; i++) {
				if (head1 == null)
					return null;
				head1 = head1.next;
			}

			while (head1 != null && head2 != null) {
				if (head1 == head2)
					return head1;
				head1 = head1.next;
				head2 = head2.next;
			}
			return null;
		}
		public static void Main (string[] args)
		{
			ListNode node1 = new ListNode (1);
			ListNode node2 = new ListNode (2);
			ListNode node3 = new ListNode (3);
			ListNode node4 = new ListNode (4);
			ListNode node5 = new ListNode (5);

			ListNode node6 = new ListNode(8);
			ListNode node7 = new ListNode(9);
			ListNode node8 = new ListNode (10);

			node1.next = node2;
			node2.next = node3;
			node3.next = node4;
			node4.next = node5;

			node6.next = node7;
			node7.next = node8;
			node8.next = node2;

			ListNode intersection = Finder.getIntersection (node1, node6);

			while (node1 != null) {
				Console.Write (node1.val + "->");
				node1 = node1.next;
			}

			Console.WriteLine ();

			while (node6 != null) {
				Console.Write (node6.val + "->");
				node6 = node6.next;
			}
			Console.WriteLine ();
			Console.WriteLine(intersection.val);
		}
		public ListNode(int x)
		{
			val = x;
			next = null;
		}