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.
考察:单链表,主要涉及快慢指针,单链表逆置,合并两链表;
Ex 1:
step1: head: 1->2 last: 3->4;
step2: head: 1->2 pre: 4->3;
step3: 1->4->2->3;
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
void reorderList(ListNode* head) {
if (head == NULL || head->next == NULL || head->next->next == NULL)
return ;
ListNode *fast, *slow;
fast = head, slow = head;
while (fast->next && fast->next->next) {
fast = fast->next->next;
slow = slow->next;
}
ListNode *mid = slow->next;
slow->next = NULL;
ListNode *last = mid;
ListNode *pre = NULL;
while (last) {
ListNode *tmp = last->next;
last->next = pre;
pre = last;
last = tmp;
}
while(head && pre) {
ListNode *tmp = head->next;
head->next = pre;
pre = pre->next;
head->next->next = tmp;
head = tmp;
}
}
};