C++實現LeetCode(147.鏈表插入排序)

[LeetCode] 147. Insertion Sort List 鏈表插入排序

Sort a linked list using insertion sort.

A graphical example of insertion sort. The partial sorted list (black) initially contains only the first element in the list.
With each iteration one element (red) is removed from the input data and inserted in-place into the sorted list

Algorithm of Insertion Sort:

  1. Insertion sort iterates, consuming one input element each repetition, and growing a sorted output list.
  2. At each iteration, insertion sort removes one element from the input data, finds the location it belongs within the sorted list, and inserts it there.
  3. It repeats until no input elements remain.

Example 1:

Input: 4->2->1->3
Output: 1->2->3->4

Example 2:

Input: -1->5->3->4->0
Output: -1->0->3->4->5

鏈表的插入排序實現原理很簡單,就是一個元素一個元素的從原鏈表中取出來,然後按順序插入到新鏈表中,時間復雜度為 O(n2),是一種效率並不是很高的算法,但是空間復雜度為 O(1),以高時間復雜度換取瞭低空間復雜度,參見代碼如下:

class Solution {
public:
    ListNode* insertionSortList(ListNode* head) {
        ListNode *dummy = new ListNode(-1), *cur = dummy;
        while (head) {
            ListNode *t = head->next;
            cur = dummy;
            while (cur->next && cur->next->val <= head->val) {
                cur = cur->next;
            }
            head->next = cur->next;
            cur->next = head;
            head = t;
        }
        return dummy->next;
    }
};

Github 同步地址:

https://github.com/grandyang/leetcode/issues/147

類似題目:

Sort List

Insert into a Cyclic Sorted List

參考資料:

https://leetcode.com/problems/insertion-sort-list/

https://leetcode.com/problems/insertion-sort-list/discuss/46423/Explained-C%2B%2B-solution-(24ms)

https://leetcode.com/problems/insertion-sort-list/discuss/46420/An-easy-and-clear-way-to-sort-(-O(1)-space-)

到此這篇關於C++實現LeetCode(147.鏈表插入排序)的文章就介紹到這瞭,更多相關C++實現鏈表插入排序內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: