leetcode day2 -- Sort List Insertion Sort List
Sort a linked list in?O(n?log?n) time using constant space complexity.
分析:對(duì)鏈表排序不是第一次見,但是這是對(duì)非排序鏈表,看復(fù)雜度O(nlgn),想到歸并、快排、堆排等,但是對(duì)于鏈表不能隨機(jī)存取,快排不適合。想到用歸并的方法來實(shí)現(xiàn),可以通過兩個(gè)指針遍歷求中點(diǎn),將鏈表分成兩端,分別排序,再合并鏈表,在處理過程中,我將前一段鏈表的最后一個(gè)結(jié)點(diǎn)的next設(shè)置為NULL。
代碼如下:
class Solution { public:ListNode *sortList(ListNode *head) {if(head == NULL){return NULL;}ListNode* midNode1 = findMid(head);ListNode* midNode2 = midNode1->next;midNode1->next = NULL;ListNode* pHead1 = head;if(midNode1 != head){pHead1 = sortList(head);} ListNode* pHead2 = midNode2;if(midNode2 !=NULL && midNode2->next !=NULL){pHead2 = sortList(midNode2);}return mergeLists(pHead1,pHead2);} private:ListNode* findMid(ListNode *head){ListNode* preNode = head;ListNode* node1 = head;ListNode* node2 = head->next;if( node2 == NULL){return preNode;}else{node2 = node2->next;}while(node2 != NULL){ preNode = node1;node2 = node2->next;if(node2 != NULL){node2 = node2->next;node1 = node1->next; }}return preNode;}ListNode* mergeLists(ListNode* list1, ListNode* list2){if(list1 == NULL){return list2;} else if(list2 == NULL){return list1;}ListNode* pHead = NULL;if( list1->val < list2->val ){pHead = list1;pHead->next = mergeLists(list1->next,list2);}else{pHead = list2;pHead->next = mergeLists(list1,list2->next);}return pHead;} };2、Insertion Sort List?
Sort a linked list using insertion sort.
分析:插入排序方法實(shí)現(xiàn)鏈表排序,感覺不難,但是老是弄成死循環(huán),最后還是搞清楚了。
思路,從頭開始遍歷一個(gè)個(gè)插入排序,待插入節(jié)點(diǎn),從鏈表頭開始找插入位置,將結(jié)點(diǎn)插入,注意保存下次需要插入的結(jié)點(diǎn)。
插入方法:待插入節(jié)點(diǎn),從鏈表頭開始找插入位置,如果位于鏈表頭部,則將原插入節(jié)點(diǎn)從當(dāng)時(shí)位置刪除,插入頭部,并修改鏈表頭指針;如果插入位置位于位于原出入節(jié)點(diǎn)位置之前,同樣將原插入節(jié)點(diǎn)從當(dāng)時(shí)位置刪除,插入到當(dāng)前位置;如果插入位置就是原結(jié)點(diǎn)位置,則不變。
代碼如下:
class Solution { public:ListNode *insertionSortList(ListNode *head) {if( head == NULL ){return NULL;}ListNode* sortHead = head;ListNode* tempNode = NULL;ListNode* preNode = head;head = head->next;while(head != NULL){tempNode = head;head = head->next;preNode = insertNode(&sortHead,tempNode,preNode);}return sortHead;} private:ListNode* insertNode(ListNode **head,ListNode *node,ListNode* preInsertNode){ListNode* preNode = *head;if((*head)->val < node->val){while( preNode != node && preNode->next != NULL && preNode->next->val <= node->val){preNode = preNode->next;}}else{preInsertNode->next = node->next;node->next = *head;*head = node;return preInsertNode;}if(preNode != node){preInsertNode->next = node->next;node->next = preNode->next;preNode->next = node;return preInsertNode;}return node;} };總結(jié)
以上是生活随笔為你收集整理的leetcode day2 -- Sort List Insertion Sort List的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: leetcode day1 -- Rev
- 下一篇: leetcode day5 -- Reo