(連結串列)連結串列的排序問題

Kobe10發表於2017-02-04
  • 題目一:對連結串列進行排序。
    •   方法一:利用陣列進行排序。效率比較低。
      •   程式碼
        /**
         * Definition for singly-linked list.
         * struct ListNode {
         *     int val;
         *     ListNode *next;
         *     ListNode(int x) : val(x), next(NULL) {}
         * };
         */
        class Solution {
        public:
            ListNode *sortList(ListNode *head) {
                vector<int> res;
                ListNode *temp = head;
                int length = 0;
                while (temp){
                    res.push_back(temp->val);
                    temp = temp->next, length++;
                }
                sort(res.begin(), res.end());
                temp = head;
                int i =0;
                while (temp && i<length){
                    temp->val = res[i];
                    temp = temp->next;
                    i++;
                }
                return head;
            }
        };

         

    •   方法二:對連結串列進行插入排序
      •   分析:這裡其實和插入排序陣列類似,但是陣列是在原陣列的基礎上面進行插入排序的,但是對於連結串列來說比較複雜,所以新建連結串列進行插入排序。插入排序顧名思義就是一個一個的將數字插入進行,插入的過程中與連結串列的所有數字進行比較,找到合適的位置進行插入,所以我們設定兩個指標,pre指向新連結串列的頭部,cur指向當前連結串列的當前節點,之後比較兩個指標的值,依次插入即可
      •   程式碼:
        /**
         * Definition for singly-linked list.
         * struct ListNode {
         *     int val;
         *     ListNode *next;
         *     ListNode(int x) : val(x), next(NULL) {}
         * };
         */
        class Solution {
        public:
            ListNode *sortList(ListNode *head) {
                if(head == NULL || head->next == NULL) return head;  
                ListNode* dummyhead = new ListNode(0);  
                ListNode* pre = dummyhead;  
                ListNode* cur = head;  
                  
                while(cur != NULL)  
                {  
                    ListNode* next = cur->next;  //維護連結串列的下一個結點  
                    pre = dummyhead;             //重置pre為新連結串列頭開始  
                      
                    //在當前排好的新連結串列中找到第一個大於cur->val的結點  
                    while(pre->next != NULL && pre->next->val <= cur->val)  
                    {  
                        pre = pre->next;  
                    }  
                      
                    //當前pre的next結點的值大於cur的值,將cur插入到pre後  
                    cur->next = pre->next;  
                    pre->next = cur;  
                    cur = next;   //cur指向原連結串列的下一個節點  
                }  
                return dummyhead->next;  
            }
        };

         

相關文章