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;
}