Leetcode 147:對連結串列進行插入排序(最詳細解決方案!!!)
對連結串列進行插入排序。
插入排序的動畫演示如上。從第一個元素開始,該連結串列可以被認為已經部分排序(用黑色表示)。
每次迭代時,從輸入資料中移除一個元素(用紅色表示),並原地將其插入到已排好序的連結串列中。
插入排序演算法:
- 插入排序是迭代的,每次只移動一個元素,直到所有元素可以形成一個有序的輸出列表。
- 每次迭代中,插入排序只從輸入資料中移除一個待排序的元素,找到它在序列中適當的位置,並將其插入。
- 重複直到所有輸入資料插入完為止。
示例 1:
輸入: 4->2->1->3
輸出: 1->2->3->4
示例 2:
輸入: -1 ->5->3->4->0
輸出: -1->0->3->4->5
解題思路
因為有insert
操作,所有我們上來就定義三個指標pre
、cur
、lat
。
pre cur lat
h -> 4 -> 2 -> 5 -> 3 -> null
tmp
當tmp!=lat
並且tmp.val<lat.val
的時候 ,我們要移動tmp
和pre
cur lat
h -> 4 -> 2 -> 5 -> 3 -> null
pre tmp
接著insert
操作2
---------------
| |
cur lat
h 4 <- 2 5 -> 3 -> null
pre tmp
| |
---------------
接著我們要讓pre
和tmp
復位,因為每次都是從前往後找插入位置(和圖有區別,對於單向連結串列,我們無法從後往前)。
cur lat
h -> 2 -> 4 -> 5 -> 3 -> null
pre tmp
由於tmp.val < lat.val
,移動pre
和tmp
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
leetcode【147.對連結串列進行插入排序】
題目描述: 對連結串列進行插入排序。 插入排序的動畫演示如上。從第一個元素開始,該連結串列可以被認為已經部分排序(用黑色表示)。每次迭代時,從輸入資料中移除一個元素,並原地將其插入已拍好的連結串列中。 示例 1 輸入:
【LeetCode】147. 對連結串列進行插入排序 結題報告 (C++)
題目描述: 對連結串列進行插入排序。 插入排序的動畫演示如上。從第一個元素開始,該連結串列可以被認為已經部分排序(用黑色表示)。 每次迭代時,從輸入資料中移除一個元素(用紅色表示),並原地將其插入到已排好序的連結串列中。 插入排序演算法: 插入排序是迭代的,
【LeetCode】147. 對連結串列進行插入排序
插入排序演算法: 插入排序是迭代的,每次只移動一個元素,直到所有元素可以形成一個有序的輸出列表。 每次迭代中,插入排序只從輸入資料中移除一個待排序的元素,找到它在序列中適當的位置,並將其插入。 重複直到所有輸入資料插入完為止。 方法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/ 題目描述: 知識點:插入排序、