Q:给出单链表L:L 0→L 1→…→L n-1→L n, 将其重新排序为:L 0→L n→L 1→L n-1→L 2→L n-2→…
例如:1->4->2->3->5->9
排序后:1->9->4->5->2->3
解题思路:
- 从题意我们可以发现,排序是按照一首一尾、一首一尾来进行
- 我们可以先找到中间节点,将链表分割为两个部分;再将后半部分链表进行反转;
- 最后将后半部分反转后的链表插入前半部分链表
画图理解:
代码实现:
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)
return;
ListNode* slow=head;
ListNode* fast=head;
while(fast!=NULL&&fast->next!=NULL&&fast->next->next!=NULL) //找中间节点
{
slow=slow->next;
fast=fast->next->next;
}
ListNode* newhead=slow->next;
slow->next=NULL; //分割链表
ListNode* prev=NULL;
while(newhead) //反转后半部分链表
{
ListNode* next=newhead->next;
newhead->next=prev;
prev=newhead;
newhead=next;
}
ListNode* n1=NULL;
ListNode* n2=NULL;
newhead=prev;
ListNode* cur=head;
while(cur!=NULL&&newhead!=NULL) //合并链表
{
n1=cur->next;
n2=newhead->next;
cur->next=newhead;
cur=n1;
newhead->next=cur;
newhead=n2;
}
}
};