//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; }