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