问题描述:
问题分析:
这是一个非常有意思的排序问题,相当于是“强弱搭配”游戏,第一个与最后一个,倒数第二个和顺数第二个搭配起来。
于是我们可以考虑采用双指针的方式进行递归链表重新连接。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *new_head = nullptr;
void reorderList(ListNode* head) {
if(head==nullptr) return;
//采用快慢指针找中间节点
ListNode *fast = head->next, *slow = head;
while(fast!=nullptr && fast->next!=nullptr)
{
slow = slow->next;
fast = fast->next->next;
}
//当fast到达了队尾,将fast重新指向被截断的后半截链表
fast = slow->next;
slow->next = nullptr;
new_head = head;
DFS(fast,nullptr);
}
//用来处理从尾部截取的节点,将其放入“前半段链表”中的指定位置
void DFS(ListNode *lower, ListNode *prenode)
{
if(lower ==nullptr) return;
DFS(lower->next,lower);
if(prenode!=nullptr)
{
prenode->next = nullptr;
lower->next = new_head->next;
new_head->next = lower;
new_head = new_head->next->next;
}
else
{
lower->next = new_head->next;
new_head->next = lower;
}
}
};