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}
.
The approach is that we can reverse the list from middle point to the end first and then connect the the reversed list to the original list one by one. Here is an example:
1 → 2 → 3 → 4 → 5
Reverse from the middle: 1 → 2 → 5 → 4 → 3
Connect the original one to the reversed one: 1 → 5 → 2 → 4 → 3
C++ Code:
/* * func: reorder_list * goal: reorder the linked list * @param head: head node of the list * return: */ void reorder_list(ListNode *head){ if(head == nullptr || head->next == nullptr){ return; } //Find the middle pointer ListNode *slow = head; ListNode *fast = head; while(fast->next && fast->next->next){ slow = slow->next; fast = fast->next->next; } //Reverse from iter_s->next to the end ListNode *prev = slow; ListNode *curr = slow->next; prev->next = nullptr; while(curr) { ListNode *next = curr->next; curr->next = prev; prev = curr; curr = next; } //Reorder ListNode *first = head; ListNode *second = prev; while(first && second && first != second){ ListNode *tmp = second->next; second->next = first->next; first->next = second; first = second->next; second = tmp; } }
Python Code:
# func: reorder the input list # @param head: head node of the list # @return: def reorder_list(head): if not head or not head.next: return None slow = head fast = head while fast.next and fast.next.next: slow = slow.next fast = fast.next.next #Reverse from slow to the end prev = slow curr = slow.next prev.next = None while curr: next = curr.next curr.next = prev prev = curr curr = next #Reorder first = head second = prev while first and second and first != second: next = second.next second.next = first.next first.next = second first = second.next second = next
Reference Link:
1. 水中的鱼: [LeetCode] Reorder List, Solution: http://fisherlei.blogspot.com/2013/11/leetcode-reorder-list-solution.html
No comments:
Post a Comment