public static void Main()
int[] vals = {-1,-2,0,1,2,3,4,5,6,7,8};
LinkedListNode list1 = CreateLinkedListFromArray(vals);
int[] vals2 = {12, 14, 15};
LinkedListNode list2 = CreateLinkedListFromArray(vals2);
Console.WriteLine(list1.PrintForward());
Console.WriteLine(list2.PrintForward());
LinkedListNode intersection = findIntersection(list1, list2);
Console.WriteLine((intersection!=null)? intersection.PrintForward() : "No Intersection");
public static LinkedListNode findIntersection(LinkedListNode list1, LinkedListNode list2)
if(list1 == null || list2 == null) return null;
TailAndSize result1= getTailAndSize(list1);
TailAndSize result2= getTailAndSize(list2);
if(result1.tail != result2.tail)
LinkedListNode shorter = result1.size < result2.size? list1 : list2;
LinkedListNode longer = result1.size < result2.size? list2 : list1;
longer = getKthNode(longer, Math.Abs(result1.size - result2.size));
public static LinkedListNode getKthNode(LinkedListNode head, int k)
LinkedListNode current = head;
while(k > 0 && current != null)
public LinkedListNode tail;
public TailAndSize(LinkedListNode tail, int size)
public static TailAndSize getTailAndSize(LinkedListNode list)
if(list == null) return null;
LinkedListNode current =list;
while(current.Next != null)
return new TailAndSize(current,size);
public static LinkedListNode CreateLinkedListFromArray(int[] vals)
LinkedListNode head = new LinkedListNode(vals[0], null, null);
LinkedListNode current = head;
for (int i = 1; i < vals.Length; i++)
current = new LinkedListNode(vals[i], null, current);
public class LinkedListNode
public LinkedListNode Next { get; set; }
public LinkedListNode Prev { get; set; }
public LinkedListNode Last { get; set; }
public int Data { get; set; }
public LinkedListNode(int d, LinkedListNode n, LinkedListNode p)
public void SetNext(LinkedListNode n)
if (n != null && n.Prev != this)
public void SetPrevious(LinkedListNode p)
if (p != null && p.Next != this)
public String PrintForward()
return string.Format("{0}->{1}", Data, Next.PrintForward());
return string.Format("{0}", Data);
public LinkedListNode Clone()
LinkedListNode next2 = null;
LinkedListNode head2 = new LinkedListNode(Data, next2, null);