143. Reorder List
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.
Example 1:
Input: head = [1,2,3,4]
Output: [1,4,2,3]
Example 2:
Input: head = [1,2,3,4,5]
Output: [1,5,2,4,3]
Constraints:
- The number of nodes in the list is in the range [ 1 , 5 ∗ 1 0 4 ] [1, 5 * 10^4] [1,5∗104].
- 1 <= Node.val <= 1000
From: LeetCode
Link: 143. Reorder List
Solution:
Ideas:
- Find the middle of the linked list: We can use the fast and slow pointer technique to find the middle node.
- Reverse the second half of the linked list: Once we find the middle, we need to reverse the second half of the list.
- Merge the two halves: Finally, we merge the two halves by alternating nodes from the first half and the reversed second half.
Code:
cpp
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
void reorderList(struct ListNode* head) {
if (!head || !head->next) return;
// Step 1: Find the middle of the linked list
struct ListNode *slow = head, *fast = head;
while (fast->next && fast->next->next) {
slow = slow->next;
fast = fast->next->next;
}
// Step 2: Reverse the second half of the list
struct ListNode *prev = NULL, *curr = slow->next, *next = NULL;
while (curr) {
next = curr->next;
curr->next = prev;
prev = curr;
curr = next;
}
slow->next = NULL; // Cut the list into two halves
// Step 3: Merge the two halves
struct ListNode *first = head, *second = prev;
while (second) {
struct ListNode *tmp1 = first->next, *tmp2 = second->next;
first->next = second;
second->next = tmp1;
first = tmp1;
second = tmp2;
}
}
// Helper function to create a new ListNode
struct ListNode* newNode(int val) {
struct ListNode* node = (struct ListNode*)malloc(sizeof(struct ListNode));
node->val = val;
node->next = NULL;
return node;
}
// Helper function to print the linked list
void printList(struct ListNode* head) {
while (head) {
printf("%d -> ", head->val);
head = head->next;
}
printf("NULL\n");
}