1. 程式人生 > >Leetcode 147:對連結串列進行插入排序(最詳細解決方案!!!)

Leetcode 147:對連結串列進行插入排序(最詳細解決方案!!!)

對連結串列進行插入排序。

img
插入排序的動畫演示如上。從第一個元素開始,該連結串列可以被認為已經部分排序(用黑色表示)。
每次迭代時,從輸入資料中移除一個元素(用紅色表示),並原地將其插入到已排好序的連結串列中。

插入排序演算法:

  1. 插入排序是迭代的,每次只移動一個元素,直到所有元素可以形成一個有序的輸出列表。
  2. 每次迭代中,插入排序只從輸入資料中移除一個待排序的元素,找到它在序列中適當的位置,並將其插入。
  3. 重複直到所有輸入資料插入完為止。

示例 1:

輸入: 4->2->1->3
輸出: 1->2->3->4

示例 2:

輸入: -1
->5->3->4->0 輸出: -1->0->3->4->5

解題思路

因為有insert操作,所有我們上來就定義三個指標precurlat

pre    cur    lat
 h  ->  4  ->  2  ->  5  ->  3  ->  null
       tmp

tmp!=lat並且tmp.val<lat.val的時候 ,我們要移動tmppre

       cur    lat
 h  ->  4  ->  2  ->  5  ->  3  ->
null pre tmp

接著insert操作2

        ---------------
        |             |
       cur    lat
 h      4  <-  2      5  ->  3  ->  null
pre    tmp
 |             |
 ---------------

接著我們要讓pretmp復位,因為每次都是從前往後找插入位置(和圖有區別,對於單向連結串列,我們無法從後往前)。

              cur    lat
 h  ->  2  ->
4 -> 5 -> 3 -> null pre tmp

由於tmp.val < lat.val,移動pretmp

              cur    lat
 h  ->  2  ->  4  ->  5  ->  3  ->  null
              pre    tmp

這個時候我們不用reverse,所以我們讓cur = lat並且lat=cur.next,跳過去就可以了。

                     cur    lat
 h  ->  2  ->  4  ->  5  ->  3  ->  null
              pre    tmp

接著tmp.val > lat.val,所以進行insert操作。

       ----------------------
       |                    |
             ---------------
              |             |     
                    cur    lat
h  ->  2      4  ->  5      3      null
      pre    tmp
                     |              |
                     ----------------
                            cur     lat
 h  ->  2  ->  3  ->  4  ->  5  ->  null
pre    tmp

以下是這個過程的完整程式碼

class Solution:
    def insertionSortList(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        if head == None or head.next == None:
            return head

        h = ListNode(-1)
        h.next = head
        cur = head
        lat = cur.next
        while lat != None: 
            tmp, pre = h.next, h
            while tmp != lat and tmp.val < lat.val:
                tmp = tmp.next
                pre = pre.next
            if tmp == lat:
                cur = lat
            else:
                cur.next = lat.next
                lat.next = tmp
                pre.next = lat

            lat = cur.next

        return h.next

這個問題其實不是很複雜,主要就是指標比較多,一定要理清楚每個指標的含義。或者可以這樣做

class Solution:
    def insertionSortList(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        if head == None or head.next == None:
            return head

        h = ListNode(-1)
        h.next = head
        pre = h
        cur = head
        while cur != None: 
            lat = cur.next
            if lat != None and lat.val < cur.val:#只有cur.next比cur小的時候我們才尋找插入點
                while pre.next != None and pre.next.val < lat.val:
                    pre = pre.next
                tmp = pre.next
                pre.next = lat
                cur.next = lat.next
                lat.next = tmp
                pre = h
            else:
                cur = lat

        return h.next

這種寫法的好處是避免了大量的重複比較操作。

如有問題,希望大家指出!!!

相關推薦

Leetcode 147:連結串列進行插入排序詳細解決方案

對連結串列進行插入排序。 插入排序的動畫演示如上。從第一個元素開始,該連結串列可以被認為已經部分排序(用黑色表示)。 每次迭代時,從輸入資料中移除一個元素(用紅色表示),並原地將其插入到已排好序

Leetcode 147 連結串列進行插入排序

按照陣列插入排序的思路,需要把陣列分成以排序和未排序的兩部分: 每次從未排序的陣列中拿出一個插入已排序的陣列中,指到未排序陣列未空。在插入的過程中涉及到陣列的遍歷查詢,而陣列是可以按下標從後向前遍歷的: void InsertSort(int a[], int n) { for

LeetCode-147. 連結串列進行插入排序

題目 對連結串列進行插入排序。 插入排序的動畫演示如上。從第一個元素開始,該連結串列可以被認為已經部分排序(用黑色表示)。 每次迭代時,從輸入資料中移除一個元素(用紅色表示),並原地將其插入到已排好序的連結串列中。 插入排序演算法: 插入排序是迭代的,每次只移動一個元素

Leetcode 147. 連結串列進行插入排序 C++

題目描述: 對連結串列進行插入排序。  插入排序的動畫演示如上。從第一個元素開始,該連結串列可以被認為已經部分排序(用黑色表示)。 每次迭代時,從輸入資料中移除一個元素(用紅色表示),並原地將其插入到已排好序的連結串列中。 示例 1: 輸入: 4->2-&g

LeetCode 147.連結串列進行插入排序

對連結串列進行插入排序。 插入排序的動畫演示如上。從第一個元素開始,該連結串列可以被認為已經部分排序(用黑色表示)。每次迭代時,從輸入資料中移除一個元素(用紅色表示),並原地將其插入到已排好序的連結串列中。   插入排序演算法: 插入排序是迭代的,每次只移動一個元素,直到所有元素可以形

LeetCode 147. 連結串列進行插入排序(C++)

題目: 對連結串列進行插入排序。 動畫演示 插入排序的動畫演示如上。從第一個元素開始,該連結串列可以被認為已經部分排序(用黑色表示)。 每次迭代時,從輸入資料中移除一個元素(用紅色表示),並原地

Leetcode 237:刪除連結串列中的節點詳細解決方案

請編寫一個函式,使其可以刪除某個連結串列中給定的(非末尾)節點,你將只被給定要求被刪除的節點。 現有一個連結串列 – head = [4,5,1,9],它可以表示為: 4 -> 5

leetcode147.連結串列進行插入排序

題目描述: 對連結串列進行插入排序。 插入排序的動畫演示如上。從第一個元素開始,該連結串列可以被認為已經部分排序(用黑色表示)。每次迭代時,從輸入資料中移除一個元素,並原地將其插入已拍好的連結串列中。 示例 1 輸入:

LeetCode147. 連結串列進行插入排序 結題報告 (C++)

題目描述: 對連結串列進行插入排序。 插入排序的動畫演示如上。從第一個元素開始,該連結串列可以被認為已經部分排序(用黑色表示)。 每次迭代時,從輸入資料中移除一個元素(用紅色表示),並原地將其插入到已排好序的連結串列中。 插入排序演算法: 插入排序是迭代的,

LeetCode147. 連結串列進行插入排序

插入排序演算法: 插入排序是迭代的,每次只移動一個元素,直到所有元素可以形成一個有序的輸出列表。 每次迭代中,插入排序只從輸入資料中移除一個待排序的元素,找到它在序列中適當的位置,並將其插入。 重複直到所有輸入資料插入完為止。 方法1:嚴格按照演算法說明,在原始列表中進

[leetcode]Python實現-147.連結串列進行插入排序

147.對連結串列進行插入排序 描述 對連結串列進行插入排序。 插入排序的動畫演示如上。從第一個元素開始,該連結串列可以被認為已經部分排序(用黑色表示)。 每次迭代時,從輸入資料中移除一個元素(用紅色表示),並原地將其插入到已排好序的連結串

147,連結串列進行插入排序

對連結串列進行插入排序。 插入排序的動畫演示如上。從第一個元素開始,該連結串列可以被認為已經部分排序(用黑色表示)。 每次迭代時,從輸入資料中移除一個元素(用紅色表示),並原地將其插入到已排好序的連結串列中。   插入排序演算法: 插入排序是迭代的,每次只移動一個元

147. 連結串列進行插入排序

對連結串列進行插入排序。 插入排序的動畫演示如上。從第一個元素開始,該連結串列可以被認為已經部分排序(用黑色表示)。 每次迭代時,從輸入資料中移除一個元素(用紅色表示),並原地將其插入到已排好序的連結串列中。   插入排序演算法: 插入排序是迭代的,每次只移動一

LeetCode自我總結連結串列進行插入排序

對連結串列進行插入排序。 插入排序的動畫演示如上。從第一個元素開始,該連結串列可以被認為已經部分排序(用黑色表示)。 每次迭代時,從輸入資料中移除一個元素(用紅色表示),並原地將其插入到已排好序的連結串列中。   插入排序演算法: 插入排序是迭代的,每次只移動一個元

LeetCode 中等題】69-連結串列進行插入排序

題目描述:對連結串列進行插入排序。 插入排序的動畫演示如上。從第一個元素開始,該連結串列可以被認為已經部分排序(用黑色表示)。 每次迭代時,從輸入資料中移除一個元素(用紅色表示),並原地將其插入到已排好序的連結串列中。 插入排序演算法: 插入排序是迭代的,每次只移動一個元素,直到

leetcode147連結串列進行插入排序

def insertionSortList(self, head): """ 對連結串列進行插入排序,單鏈表沒有前驅指標只能從前往後,新增一個輔助有序連結串列,依次從前比較 """ new_head = ListNode(0) ##

[Swift]LeetCode147. 連結串列進行插入排序 | 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

LeetCode147. 連結串列進行插入排序

對連結串列進行插入排序。 插入排序的動畫演示如上。從第一個元素開始,該連結串列可以被認為已經部分排序(用黑色表示)。 每次迭代時,從輸入資料中移除一個元素(用紅色表示),並原地將其插入到已排好序的連

leetcode142 連結串列進行插入排序

題目 對連結串列進行插入排序 插入排序的動畫演示如上。從第一個元素開始,該連結串列可以被認為已經部分排序(用黑色表示)。 每次迭代時,從輸入資料中移除一個元素(用紅色表示),並原地將其插入到已排好序的連結串列中。 插入排序演算法: 插入排序是迭代的,每次只移動一個元素,直到所有元素可

LeetCode147——連結串列進行插入排序

我的LeetCode程式碼倉:https://github.com/617076674/LeetCode 原題連結:https://leetcode-cn.com/problems/insertion-sort-list/description/ 題目描述: 知識點:插入排序、