leetcode-重排連結串列-記錄學習
阿新 • • 發佈:2018-11-28
重排連結串列
這道題考察連結串列三個基本操作,第一,找連結串列的中節點,節點之前是一個連結串列;第二,從中間節之後開始反轉,又形成一個新的連結串列,第三,合併這兩個連結串列。這裡需要注意的是(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;
}
};