LeetCode演算法解析之對鍊錶進行插入排序

2021-10-10 16:37:43 字數 1857 閱讀 3157

對鍊錶進行插入排序。

插入排序演算法:

示例 1:

示例 2:

方法一:從前往後找插入點

插入排序的基本思想是,維護乙個有序序列,初始時有序序列只有乙個元素,每次將乙個新的元素插入到有序序列中,將有序序列的長度增加

11,直到全部元素都加入到有序序列中。

如果是陣列的插入排序,則陣列的前面部分是有序序列,每次找到有序序列後面的第乙個元素(待插入元素)的插入位置,將有序序列中的插入位置後面的元素都往後移動一位,然後將待插入元素置於插入位置。

對於鍊錶而言,插入元素時只要更新相鄰節點的指標即可,不需要像陣列一樣將插入位置後面的元素往後移動,因此插入操作的時間複雜度是 o(1)o(1),但是找到插入位置需要遍歷鍊錶中的節點,時間複雜度是 o(n)o(n),因此鍊錶插入排序的總時間複雜度仍然是 o(n^2)o(n 2),其中 nn 是鍊錶的長度。

對於單向鍊錶而言,只有指向後乙個節點的指標,因此需要從鍊錶的頭節點開始往後遍歷鍊錶中的節點,尋找插入位置。

對鍊錶進行插入排序的具體過程如下。

若 lastsorted.val <= curr.val,說明 curr 應該位於 lastsorted 之後,將 lastsorted

後移一位,curr 變成新的 lastsorted。

否則,從鍊錶的頭節點開始往後遍歷鍊錶中的節點,尋找插入 curr 的位置。令 prev 為插入 curr

的位置的前乙個節點,進行如下操作,完成對 curr 的插入:

lastsorted.next = curr.next

curr.next = prev.next

prev.next = curr

重複第 5 步和第 6 步,直到 curr 變成空,排序結束。返回 dummyhead.next,為排序後的鍊錶的頭節點。

class

solution

listnode dummyhead =

newlistnode(0

);dummyhead.next = head;

listnode lastsorted = head, curr = head.next;

while

(curr != null)

else

lastsorted.next = curr.next;

curr.next = prev.next;

prev.next = curr;

} curr = lastsorted.next;

}return dummyhead.next;

}}

核心總結:

在原有鍊錶基礎上,交換任意相鄰兩個節點位置,

LeetCode初級演算法之鍊錶 回文鍊錶

請判斷乙個鍊錶是否為回文鍊錶。示例 1 輸入 1 2 輸出 false 示例 2 輸入 1 2 2 1 輸出 true 高階 你能否用 o n 時間複雜度和 o 1 空間複雜度解決此題?思路一 借助外來的空間 這個題我的初步思路是借助外來的空間,也就不是o 1 的空間複雜度,那麼這個就比較簡單了,只...

LeetCode演算法打卡之環形鍊錶

題目要求查詢鍊錶中是否有環,因為每個鍊錶節點都有唯一的識別符號 位址,我們可以使用乙個儲存位址的雜湊表來做,每經過乙個節點,就把這個節點的位址記錄到雜湊表中,同時查詢雜湊表中是否有相同的位址。如果有,就說明指標又指回了之前經過的節點,於是鍊錶有環。如果指標最後到了末尾,變成了空指標,則鍊錶沒有環。實...

LeetCode初級演算法之鍊錶 206 反轉鍊錶

題目資訊 反轉乙個單鏈表。示例 輸入 1 2 3 4 5 null 輸出 5 4 3 2 1 null 高階 你可以迭代或遞迴地反轉鍊錶。你能否用兩種方法解決這道題?解法一 迭代 反轉乙個鍊錶和陣列是不一樣的,因為不能任意取值,只能說按照next的順序依次往後放。那麼把乙個節點往後放的過程就是一次迭...