题意
给一个链表 L:L0→L1→L2→L3→...→Ln
要求将其转化为: L′:L0→Ln→L1→Ln−1...
思路
比较综合的一道链表题,分为三步去做:
- 找到链表的中点,并且将链表从中点拆开为前后两条链表
- 将第二条链表翻转
- 按照题意合并第一条和第二条链表即可
所以,只需要写3个函数去做上面的三步操作即可。
链表题细节很多呐= =
代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* Reverse(ListNode* head) {
if (!head) return NULL;
ListNode* vhead = new ListNode(0);
vhead->next = head;
ListNode *pre = vhead, *now = head;
while (now) {
ListNode* next = now->next;
now->next = pre;
pre = now;
now = next;
}
head->next = NULL;
delete(vhead);
return pre;
}
ListNode* FindMid(ListNode* head) {
if (!head) return NULL;
ListNode *slow = head, *fast = head->next;
//mid = l / 2
while (fast && fast->next) {
slow = slow->next;
fast = fast->next->next;
}
return slow;
}
ListNode* Merge(ListNode* p1, ListNode* p2) {
ListNode* head = p1;
while (p1 && p2) {
ListNode* next1 = p1->next;
p1->next = p2;
p1 = p2;
p2 = next1;
}
return head;
}
ListNode* reorderList(ListNode* head) {
if (!head) return NULL;
ListNode* mid = FindMid(head);
ListNode* mid_next = mid->next;
mid->next = NULL;
ListNode* end = Reverse(mid_next);
ListNode* start = head;
return Merge(start, end);
}
};