Time Complexity: O(n)
Space Complexity: O(1)
class Solution { public boolean isPalindrome(ListNode head) { // trivially palindrome if (head == null || head.next == null) return true; // Find middle ListNode slow = head; ListNode fast = head; while (fast != null && fast.next != null) { slow = slow.next; fast = fast.next.next; } // If odd length, skip the middle node // because in the odd case the middle node is not relevant for nowing if a list is palindrome if (fast != null) slow = slow.next; // Reverse second half ListNode second = reverse(slow); // Compare halves ListNode p1 = head; ListNode p2 = second; boolean ok = true; while (p2 != null) { if (p1.val != p2.val) { ok = false; break; } p1 = p1.next; p2 = p2.next; } return ok; } private ListNode reverse(ListNode head) { ListNode prev = null; ListNode curr = head; while (curr != null) { ListNode nxt = curr.next; curr.next = prev; prev = curr; curr = nxt; } return prev; } }
Top comments (0)