题目描述:
Given a singly linked list L: L 0→L 1→…→L n-1→L n,
reorder it to: L 0→L n →L 1→L n-1→L 2→L n-2→…
You must do this in-place without altering the nodes' values.
For example,
Given{1,2,3,4}, reorder it to{1,4,2,3}.
解题思路:
通过快慢指针寻找中间节点,拆分前后链表节点,将后面的链表反转,合并链表
//另:题目要求是就地解决,应该是不能使用用辅助栈之类的
C++实现代码:
/**
* 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)
return;
ListNode *slow=head;
ListNode *fast=head;
// 快满指针找到中间节点
while(fast->next&&fast->next->next)
{
fast=fast->next->next;
slow=slow->next;
}
// 拆分链表,并反转中间节点之后的链表
ListNode *after=slow->next;
slow->next=NULL;
ListNode *pre=NULL;
while(after!=NULL)
{
ListNode *tmp=after->next;
after->next=pre;
pre=after;
after=tmp;
}
// 合并两个链表
ListNode *first=head;
after=pre;
while(first&&after)
{
ListNode *tmp=after;
after=after->next;
tmp->next=first->next;
first->next=tmp;
first=first->next->next;
}
}
};