問題描述:
問題分析:
這是一個非常有意思的排序問題,相當於是“強弱搭配”遊戲,第一個與最後一個,倒數第二個和順數第二個搭配起來。
於是我們可以考慮採用雙指針的方式進行遞歸鏈表重新連接。
/**
* 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;
}
}
};