public CtciLinkedListNode <T> FindBeginning(CtciLinkedListNode <T> head)
        {
            if (head == null)
            {
                throw new Exception("Incorrect Data");
            }

            CtciLinkedListNode <T> slow = head;
            CtciLinkedListNode <T> fast = head;

            do
            {
                if (fast.Next == null || fast.Next.Next == null)
                {
                    return(null);
                }

                slow = slow.Next;
                fast = fast.Next.Next;
            } while (slow != fast);

            slow = head;

            while (slow != fast)
            {
                slow = slow.Next;
                fast = fast.Next;
            }

            return(slow);
        }
        public Q07_Result <T> FindLengthAndLastNode(CtciLinkedListNode <T> listNode)
        {
            int length = 1;

            while (listNode.Next != null)
            {
                listNode = listNode.Next;
                length++;
            }

            return(new Q07_Result <T>(length, listNode));
        }
        public CtciLinkedListNode <T> FindIntersection(CtciLinkedListNode <T> listNode1, CtciLinkedListNode <T> listNode2)
        {
            if (listNode1 == null || listNode2 == null)
            {
                throw new Exception("Incorrect Data");
            }

            Q07_Result <T> result1 = FindLengthAndLastNode(listNode1);
            Q07_Result <T> result2 = FindLengthAndLastNode(listNode2);

            if (result1.lastNode != result2.lastNode)
            {
                return(null);
            }

            CtciLinkedListNode <T> longer;
            CtciLinkedListNode <T> shorter;

            if (result1.length >= result2.length)
            {
                longer  = listNode1;
                shorter = listNode2;
            }
            else
            {
                longer  = listNode2;
                shorter = listNode1;
            }

            int diff = result1.length - result2.length;

            for (int i = 0; i < diff; i++)
            {
                longer = longer.Next;
            }

            while (longer != null)
            {
                if (longer == shorter)
                {
                    return(longer);
                }

                longer  = longer.Next;
                shorter = shorter.Next;
            }

            return(null);
        }
        public void FindIntersection()
        {
            CtciLinkedListNode <int> listHead1 = new CtciLinkedListNode <int>(1);
            CtciLinkedListNode <int> listHead2 = new CtciLinkedListNode <int>(1);

            CtciLinkedListNode <int> node1  = new CtciLinkedListNode <int>(1);
            CtciLinkedListNode <int> node2  = new CtciLinkedListNode <int>(1);
            CtciLinkedListNode <int> node3  = new CtciLinkedListNode <int>(1);
            CtciLinkedListNode <int> node4  = new CtciLinkedListNode <int>(1);
            CtciLinkedListNode <int> node5  = new CtciLinkedListNode <int>(1);
            CtciLinkedListNode <int> node6  = new CtciLinkedListNode <int>(1);
            CtciLinkedListNode <int> node7  = new CtciLinkedListNode <int>(1);
            CtciLinkedListNode <int> node8  = new CtciLinkedListNode <int>(1);
            CtciLinkedListNode <int> node9  = new CtciLinkedListNode <int>(1);
            CtciLinkedListNode <int> node10 = new CtciLinkedListNode <int>(1);
            CtciLinkedListNode <int> node11 = new CtciLinkedListNode <int>(1);
            CtciLinkedListNode <int> node12 = new CtciLinkedListNode <int>(1);

            listHead1.Next = node1;
            node1.Next     = node2;
            node2.Next     = node3;
            node3.Next     = node4;
            node4.Next     = node5;
            node5.Next     = node6;
            node6.Next     = node7;
            node7.Next     = node8;
            node8.Next     = node9;
            node9.Next     = node10;

            listHead2.Next = node11;
            node11.Next    = node12;

            Assert.Equal(null, intersection.FindIntersection(listHead1, listHead2));

            node12.Next = node6;

            Assert.Equal(node6, intersection.FindIntersection(listHead1, listHead2));
        }
        public void FindBeginning()
        {
            CtciLinkedListNode <int> node1  = new CtciLinkedListNode <int>(1);
            CtciLinkedListNode <int> node2  = new CtciLinkedListNode <int>(2);
            CtciLinkedListNode <int> node3  = new CtciLinkedListNode <int>(3);
            CtciLinkedListNode <int> node4  = new CtciLinkedListNode <int>(4);
            CtciLinkedListNode <int> node5  = new CtciLinkedListNode <int>(5);
            CtciLinkedListNode <int> node6  = new CtciLinkedListNode <int>(6);
            CtciLinkedListNode <int> node7  = new CtciLinkedListNode <int>(7);
            CtciLinkedListNode <int> node8  = new CtciLinkedListNode <int>(8);
            CtciLinkedListNode <int> node9  = new CtciLinkedListNode <int>(9);
            CtciLinkedListNode <int> node10 = new CtciLinkedListNode <int>(10);
            CtciLinkedListNode <int> node11 = new CtciLinkedListNode <int>(11);
            CtciLinkedListNode <int> node12 = new CtciLinkedListNode <int>(12);

            node1.Next  = node2;
            node2.Next  = node3;
            node3.Next  = node4;
            node4.Next  = node5;
            node5.Next  = node6;
            node6.Next  = node7;
            node7.Next  = node8;
            node8.Next  = node9;
            node9.Next  = node10;
            node10.Next = node11;
            node11.Next = node12;

            node12.Next = node5;
            Assert.Equal(node5, loopDetection.FindBeginning(node1));

            node12.Next = node7;
            Assert.Equal(node7, loopDetection.FindBeginning(node1));

            node12.Next = null;
            Assert.Null(loopDetection.FindBeginning(node1));
        }
 public Q07_Result(int length, CtciLinkedListNode <T> lastNode)
 {
     this.length   = length;
     this.lastNode = lastNode;
 }