예제 #1
0
        // Space: O(n)
        // Time: O(n)
        public static bool IsPalindromeRecursive <T>(Node <T> head)
            where T : IEquatable <T>
        {
            if (head == null)
            {
                throw new ArgumentNullException(nameof(head));
            }

            var      length = Question_2_2.GetListLength(head);
            Node <T> tempNode;

            return(IsPalindromRecursiveHelper(head, length, 0, out tempNode));
        }
예제 #2
0
        public static Node <T> FindIntersection <T>(Node <T> head1, Node <T> head2)
            where T : IEquatable <T>
        {
            if (head1 == null)
            {
                throw new ArgumentNullException(nameof(head1));
            }

            if (head2 == null)
            {
                throw new ArgumentNullException(nameof(head2));
            }

            var length1 = Question_2_2.GetListLength(head1);
            var length2 = Question_2_2.GetListLength(head2);

            var diff        = Math.Abs(length1 - length2);
            var longerHead  = length1 > length2 ? head1 : head2;
            var shorterHead = length1 <= length2 ? head1 : head2;

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

            while (longerHead != null && shorterHead != null)
            {
                if (ReferenceEquals(longerHead, shorterHead))
                {
                    return(longerHead);
                }

                longerHead  = longerHead.Next;
                shorterHead = shorterHead.Next;
            }

            // Depending on the use case, should consider throwing and exception here.
            return(null);
        }