// Phase 1: Find Middle
ListNode slow = head, fast = head;
while (fast != null && fast.next != null) {
slow = slow.next; fast = fast.next.next;
}
// Phase 2: Reverse Second Half
ListNode prev = null, curr = slow;
while (curr != null) {
ListNode nextTemp = curr.next;
curr.next = prev; prev = curr; curr = nextTemp;
}
// Phase 3: Compare Halves
ListNode p1 = head, p2 = prev;
while (p2 != null) {
if (p1.val != p2.val) return false;
p1 = p1.next; p2 = p2.next;
}
return true;
Initializing...