面試題--連結串列實現插入排序
阿新 • • 發佈:2020-10-04
程式碼:
/** * 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; } };
雖說不難,但是面試被問到腦子一亂想不出來還是會挺傷的,所以捋一捋思路