【LeetCode】Reorder List

来源:互联网 发布:多益网络校招 编辑:程序博客网 时间:2024/06/05 18:38


Given a singly linked list L: L0L1→…→Ln-1Ln,
reorder it to: L0LnL1Ln-1L2Ln-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}.

思路:拆分为两段,然后对后半段进行倒序,最后合并。

/**  * Definition for singly-linked list.  * struct ListNode {  *     int val;  *     ListNode *next;  *     ListNode(int x) : val(x), next(NULL) {}  * };  */  class Solution {  public:      ListNode* reverseList(ListNode *head){        ListNode *newhead=NULL;        ListNode *tmp=head;        ListNode *pPrev=NULL;        while(tmp!=NULL){            ListNode *pNext=tmp->next;            if(pNext==NULL)newhead=tmp;            tmp->next=pPrev;            pPrev=tmp;            tmp=pNext;        }        return newhead;    }      void reorderList(ListNode *head) {          //拆分链        if(head==NULL || head->next==NULL)              return;          ListNode* pslow = head;          ListNode* pfast = head;          while(pfast!=NULL)          {              if(pfast != NULL)                  pfast = pfast->next;              if(pfast != NULL)                  pfast = pfast->next;              if(pfast==NULL)                  break;              pslow = pslow->next;          }          ListNode* head2 = pslow->next;          pslow->next = NULL;        //后半段倒序        head2 = reverseList(head2);        //合并        ListNode* p1 = head;          ListNode* p2 = head2;          ListNode* tmp = NULL;          while(p1!=NULL && p2 != NULL){              tmp = p1->next;              p1->next = p2;              p1 = tmp;              tmp = p2->next;              p2->next = p1;              p2 = tmp;          }      }  };  


0 0