Given a singly linked list L : L0 -> L1 -> ...Ln-1 -> Ln, reorder it to: L0 -> Ln ->L1 ->Ln-1 -> L2 -> Ln-2 ->....
You must do this in-place without altering the nodes' values.
For example, Given {1, 2, 3, 4}, reorder it to {1, 4, 2, 3}.
解题思路:
题目要求in-place, 也就是说只能使用O(1)的空间复杂度。
可以找到中间结点,沿着中间结点把链表断开,然后把后半截单链表reverse一下,最后合并两个单链表。
代码如下:
void reorderList(ListNode* head) {
if(head == nullptr || head->next == nullptr) return;
ListNode* slow = head, *fast = head, *prev = nullptr;
while(fast && fast->next) {
pre = slow;
slow = slow->next;
fast = fast->next->next;
}
prev-next = nullptr;//cut at middle
slow = reverse(slow);
//merge two lists
ListNode *curr = head;
while(curr->next) {
ListNode *tmp = curr->next;
curr->next = slow;
slow = slow->next;
curr->next->next = tmp;
curr = tmp;
}
curr->next = slow;
}
ListNode* reverse(ListNode *head) {
if(head == nullptr || head->next == nullptr) return head;
ListNode *prev = head;
for (ListNode *curr, *next = curr->next; curr; prev = curr, curr = next, next = next? next->next: nullptr){
curr->next = prev;
}
head->next = nullptr;
return prev;
}