1 题目
Given a singly linked list L: L0→L1→…→Ln-1→Ln,
reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→…
You may not modify the values in the list's nodes, only nodes itself may be changed.
Example 1:
Given 1->2->3->4, reorder it to 1->4->2->3.
Example 2:
Given 1->2->3->4->5, reorder it to 1->5->2->4->3.
2 尝试解
class Solution {
public:
void reorderList(ListNode* head) {
if(head ==NULL) return ;
ListNode* traverse = head;
int size = 1;
stack<ListNode*> saver;
while(traverse != NULL){
saver.push(traverse);
traverse = traverse->next;
}
traverse = head;
while(traverse->next != saver.top() && traverse != saver.top()){
ListNode* insert = saver.top();
saver.pop();
insert->next = traverse->next;
traverse->next = insert;
traverse = traverse->next->next;
}
saver.top()->next = NULL;
}
};
3 标准解
// O(N) time, O(1) space in total
void reorderList(ListNode *head) {
if (!head || !head->next) return;
// find the middle node: O(n)
ListNode *p1 = head, *p2 = head->next;
while (p2 && p2->next) {
p1 = p1->next;
p2 = p2->next->next;
}
// cut from the middle and reverse the second half: O(n)
ListNode *head2 = p1->next;
p1->next = NULL;
p2 = head2->next;
head2->next = NULL;
while (p2) {
p1 = p2->next;
p2->next = head2;
head2 = p2;
p2 = p1;
}
// merge two lists: O(n)
for (p1 = head, p2 = head2; p1; ) {
auto t = p1->next;
p1 = p1->next = p2;
p2 = t;
}
//for (p1 = head, p2 = head2; p2; ) {
// auto t = p1->next;
// p1->next = p2;
// p2 = p2->next;
// p1 = p1->next->next = t;
//}
}