LeetCode:Reorder List

来源:互联网 发布:问道辅助软件 编辑:程序博客网 时间:2024/05/21 21:39

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