1. 程式人生 > >leetcode-重排連結串列-記錄學習

leetcode-重排連結串列-記錄學習

重排連結串列

這道題考察連結串列三個基本操作,第一,找連結串列的中節點,節點之前是一個連結串列;第二,從中間節之後開始反轉,又形成一個新的連結串列,第三,合併這兩個連結串列。這裡需要注意的是(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; } };