1. 程式人生 > 實用技巧 >面試題--連結串列實現插入排序

面試題--連結串列實現插入排序

題目連結

程式碼:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* insertionSortList(ListNode* head) {
        if(!head||!head->next){
            return head;
        }
        ListNode* hhead=new ListNode(1);     //設立頭結點指向第一個節點,方便後續遍歷查詢
        hhead->next=head;
        ListNode* cur=head->next,*end=head;  //cur表示當前準備排序的節點,end表示已排序完成的最後一個元素
        while(cur){
            if(cur->val<end->val){      //若是小於已排序序列的最後一個元素,則需要進行插入排序
                ListNode* tmp=hhead;
                while(cur->val > tmp->next->val){  //找到需要插入位置的前一個結點(需要插入的結點跟在此節點後)
                    tmp=tmp->next;
                }
                end->next=cur->next; //剔除當前排序節點
                cur->next=tmp->next;  //兩步插入操作
                tmp->next=cur;   
                cur=end->next;  //進行下一個節點的排序
            }
            else{                      //若是小於,則直接加入已排序序列,進行下一個節點的排序
                end=end->next;
                cur=cur->next;
            }
        }
        return hhead->next;
    }
};

雖說不難,但是面試被問到腦子一亂想不出來還是會挺傷的,所以捋一捋思路