Leetcode典型題解答和分析、歸納和彙總——T143(重排鏈表)

問題描述:

問題分析:

這是一個非常有意思的排序問題,相當於是“強弱搭配”遊戲,第一個與最後一個,倒數第二個和順數第二個搭配起來。

於是我們可以考慮採用雙指針的方式進行遞歸鏈表重新連接。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *new_head = nullptr; 
    void reorderList(ListNode* head) {
        if(head==nullptr)  return;

        //採用快慢指針找中間節點
        ListNode *fast = head->next, *slow = head;

        while(fast!=nullptr && fast->next!=nullptr)
        {
            slow = slow->next;
            fast = fast->next->next;
        }

        //當fast到達了隊尾,將fast重新指向被截斷的後半截鏈表
        fast = slow->next;
        slow->next = nullptr;

        new_head = head;
        DFS(fast,nullptr);
    }


    //用來處理從尾部截取的節點,將其放入“前半段鏈表”中的指定位置
    void DFS(ListNode *lower, ListNode *prenode)
    {
      if(lower ==nullptr)  return;
      DFS(lower->next,lower);

      if(prenode!=nullptr)
      {
          prenode->next = nullptr;
          lower->next = new_head->next;
          new_head->next = lower;
          new_head = new_head->next->next;
      } 

      else 
      {
          lower->next = new_head->next;
          new_head->next = lower;
      }
    }
};

 

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