對鍊錶進行插入排序。
插入排序演算法:
示例 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的順序依次往後放。那麼把乙個節點往後放的過程就是一次迭...