演算法搜狗筆試題連結串列合併
實現一個隊連結串列排序的演算法,C/C++可以使用std::list,Java使用LinkedList
要求先描述演算法,然後再實現,演算法效率儘可能高效。
主要考察連結串列的歸併排序。
要點:需要使用快、慢指標的方法,找到連結串列的的中間節點,然後進行二路歸併排序
要求先描述演算法,然後再實現,演算法效率儘可能高效。
要點:需要使用快、慢指標的方法,找到連結串列的的中間節點,然後進行二路歸併排序
- typedef struct LNode
- {
- int data;
- struct LNode *next;
- }LNode , *LinkList;
- // 對兩個有序的連結串列進行遞迴的歸併
- LinkList MergeList_recursive(LinkList head1 , LinkList head2)
- {
- LinkList result;
- if(head1 == NULL)
- return head2;
- if(head2 == NULL)
- return head1;
- if(head1->data data)
- {
- result = head1;
- result->next = MergeList_recursive(head1->next , head2);
- }
- else
- {
- result = head2;
- result->next = MergeList_recursive(head1 , head2->next);
- }
- return result;
- }
- // 對兩個有序的連結串列進行非遞迴的歸併
- LinkList MergeList(LinkList head1 , LinkList head2)
- {
- LinkList head , result = NULL;
- if(head1 == NULL)
- return head2;
- if(head2 == NULL)
- return head1;
- while(head1 && head2)
- {
- if(head1->data data)
- {
- if(result == NULL)
- {
- head = result = head1;
- head1 = head1->next;
- }
- else
- {
- result->next = head1;
- result = head1;
- head1 = head1->next;
- }
- }
- else
- {
- if(result == NULL)
- {
- head = result = head2;
- head2 = head2->next;
- }
- else
- {
- result->next = head2;
- result = head2;
- head2 = head2->next;
- }
- }
- }
- if(head1)
- result->next = head1;
- if(head2)
- result->next = head2;
- return head;
- }
- // 歸併排序,引數為要排序的連結串列的頭結點,函式返回值為排序後的連結串列的頭結點
- LinkList MergeSort(LinkList head)
- {
- if(head == NULL)
- return NULL;
- LinkList r_head , slow , fast;
- r_head = slow = fast = head;
- // 找連結串列中間節點的兩種方法
- /*
- while(fast->next != NULL)
- {
- if(fast->next->next != NULL)
- {
- slow = slow->next;
- fast = fast->next->next;
- }
- else
- fast = fast->next;
- }*/
- while(fast->next != NULL && fast->next->next != NULL)
- {
- slow = slow->next;
- fast = fast->next->next;
- }
- if(slow->next == NULL) // 連結串列中只有一個節點
- return r_head;
- fast = slow->next;
- slow->next = NULL;
- slow = head;
- // 函式MergeList是對兩個有序連結串列進行歸併,返回值是歸併後的連結串列的頭結點
- //r_head = MergeList_recursive(MergeSort(slow) , MergeSort(fast));
- r_head = MergeList(MergeSort(slow) , MergeSort(fast));
- return r_head;
- }
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29012686/viewspace-1149844/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 連結串列面試題(七)---合併兩個有序連結串列面試題
- 演算法基礎~連結串列~排序連結串列的合併(k條)演算法排序
- 資料結構連結串列筆試題資料結構筆試
- 反轉連結串列、合併連結串列、樹的子結構
- 合併K個排序連結串列排序
- 【演算法-java實現】合併兩個有序連結串列演算法Java
- BAT 經典演算法筆試題 —— 逆轉單向連結串列BAT演算法筆試
- 測試開發每日演算法 Leecode21. 合併兩個有序連結串列演算法
- 演算法搜狗筆試題加減法演算法筆試
- 筆記--連結串列演算法筆記演算法
- Golang從合併連結串列聊遞迴Golang遞迴
- 演算法:排序連結串列:歸併排序演算法排序
- [每日一題] 第十八題:合併兩個排序的連結串列每日一題排序
- leetcode:21. 合併兩個有序連結串列(連結串列,簡單)LeetCode
- 連結串列合併-排序-logo列印參考排序Go
- leecode.23. 合併K個升序連結串列
- 23. 合併K個元素的有序連結串列
- 演算法題中的連結串列演算法
- 前端菜鳥的每週一道演算法題(三) 合併兩個有序連結串列前端演算法
- 牛客網高頻演算法題系列-BM4-合併兩個排序的連結串列演算法排序
- 《演算法筆記》6. 連結串列相關面試題總結演算法筆記面試題
- 連結串列歸併排序排序
- 讓我們一起啃演算法----合併兩個有序連結串列演算法
- 淺談歸併排序:合併 K 個升序連結串列的歸併解法排序
- 連結串列面試題(二)---連結串列逆序(連結串列反轉)面試題
- (連結串列)連結串列的排序問題排序
- 牛客網高頻演算法題系列-BM5-合併k個已排序的連結串列演算法排序
- leetcode23. 合併K個排序連結串列LeetCode排序
- LeetCode 23. 合併K個排序連結串列LeetCode排序
- 每日演算法隨筆:反轉連結串列演算法
- 每日演算法隨筆:環形連結串列演算法
- 資料結構與演算法——連結串列 Linked List(單連結串列、雙向連結串列、單向環形連結串列-Josephu 問題)資料結構演算法
- 演算法問題總結-連結串列相關演算法
- 演算法-連結串列演算法
- [演算法總結] 17 題搞定 BAT 面試——連結串列題演算法BAT面試
- leetcode雙週賽(2)-合併兩個連結串列LeetCode
- JZ-016-合併兩個排序的連結串列排序
- 每日leetcode——21. 合併兩個有序連結串列LeetCode