重排链表
这道题考察链表三个基本操作,第一,找链表的中节点,节点之前是一个链表;第二,从中间节之后开始反转,又形成一个新的链表,第三,合并这两个链表。这里需要注意的是(1)中间节点的寻找,如 while(fast &&fast->next)或者while(fast->next&& fast->next->next)找的中间节点slow位置是不一样的,可以用纸画一下就明白了,(2)截断链表时,需要last->next=NULL操作,以及反转链表的slow->next=NULL操作。合并链表的思想是借助其他博主的,思想值得借鉴,记录学习!
/**
* 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;
ListNode *last=head;
while(fast &&fast->next)
{
last=slow;
slow=slow->next;
fast=fast->next->next;
}
last->next=NULL;
//反转
ListNode* p=slow;
ListNode* q=p->next;
while(q)
{
ListNode *tmp=q->next;
q->next=p;
p=q;
q=tmp;
}
slow->next=NULL;
//合并两个链表
fast=head;
while(fast)
{
ListNode *cur=p->next;
p->next=fast->next;
fast->next=p;
fast=p->next;
last=p;
p=cur;
}
if(p !=NULL)
last->next=p;
}
};