Example: Reorder List - rFronteddu/general_wiki GitHub Wiki
You are given the head of a singly linked-list. The list can be represented as:
L0 → L1 → … → Ln - 1 → Ln Reorder the list to be on the following form:
L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → … You may not modify the values in the list's nodes. Only nodes themselves may be changed.
class Solution {
public void reorderList(ListNode head) {
if (head == null || head.next == null || head.next.next == null) {
return;
}
// Step 1: Find the middle of the list
ListNode middle = findMiddle(head);
ListNode secondHalf = middle.next;
middle.next = null; // Split the list into two halves
// Step 2: Reverse the second half of the list
secondHalf = reverseList(secondHalf);
// Step 3: Merge the two halves
mergeLists(head, secondHalf);
}
private ListNode findMiddle(ListNode head) {
ListNode slow = head;
ListNode fast = head;
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
}
return slow;
}
private ListNode reverseList(ListNode head) {
ListNode prev = null;
ListNode current = head;
while (current != null) {
ListNode next = current.next;
current.next = prev;
prev = current;
current = next;
}
return prev;
}
private void mergeLists(ListNode l1, ListNode l2) {
ListNode dummy = new ListNode(0);
ListNode current = dummy;
boolean toggle = true; // Toggle between l1 and l2
while (l1 != null && l2 != null) {
if (toggle) {
current.next = l1;
l1 = l1.next;
} else {
current.next = l2;
l2 = l2.next;
}
current = current.next;
toggle = !toggle;
}
// Attach any remaining nodes
if (l1 != null) {
current.next = l1;
} else if (l2 != null) {
current.next = l2;
}
}
}