143. Reorder List

這個題有幾種解法,一個是用vector 存儲,O(n)空間複雜度,一個是直接在鏈表上操作,O(1)空間複雜度,但是操作複雜,涉及到鏈表中點查找,revserse 以及鏈表的merge,這樣一個題就複習了三個解法。

下面是O(1)的解法。

class Solution {

public:

    ListNode* reverseList(ListNode* head){

        ListNode* tmp = new ListNode(0);

        ListNode* p1 = head;

        if(head == NULL) return head;

        ListNode* p2 = p1->next;

        p1->next = NULL;

        while(p1 != NULL && p2 != NULL){

            tmp = p2->next;

            p2->next = p1;

            p1= p2;

            p2 = tmp;

        }

        return p1;

    }

    

    void reorderList(ListNode* head) {

      if(head == NULL) return;

      ListNode* fast = head;

      ListNode* slow = head;

      ListNode* tmp  = head;

      ListNode* dummyHead = new ListNode(0);

      dummyHead->next = head;

      while(slow != NULL && fast != NULL && fast->next != NULL){

          fast = fast->next->next;

          slow = slow->next;

      }

      ListNode* newHead = slow->next;

      slow->next = NULL;

      newHead = reverseList(newHead);

      while(head != NULL && newHead != NULL){

          tmp = head->next;

          head->next = newHead;

          head = tmp;

          tmp = newHead->next;

          newHead->next = head;

          newHead = tmp;

      }

      head = dummyHead->next;

    }

};

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章