leetcode 147 對鍊錶進行插入排序

2021-10-23 10:31:19 字數 3076 閱讀 5963

147. 對鍊錶進行插入排序

對鍊錶進行插入排序。

插入排序的動畫演示如上。從第乙個元素開始,該鍊錶可以被認為已經部分排序(用黑色表示)。

每次迭代時,從輸入資料中移除乙個元素(用紅色表示),並原地將其插入到已排好序的鍊錶中。

插入排序演算法:

插入排序是迭代的,每次只移動乙個元素,直到所有元素可以形成乙個有序的輸出列表。

每次迭代中,插入排序只從輸入資料中移除乙個待排序的元素,找到它在序列中適當的位置,並將其插入。

重複直到所有輸入資料插入完為止。

示例 1:

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

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

示例 2:

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

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

主要是插入排序:

從左到右遍歷節點,依次從煉表頭開始比較,找到乙個合適的位置插入進去。

# definition for singly-linked list.

# class listnode:

# def __init__(self, x):

# self.val = x

# self.next = none

class

solution

:def

insertionsortlist

(self, head: listnode)

-> listnode:if(

not head)or(

not head.

next):

return head

left = head

while left.

next

:#對第二個開始的數進行判斷

node = left.

next

#取要判斷的數為node

if node.val >= left.val:

#如果node值比大於等於前乙個值,那麼就不變,指標右移。

left = left.

next

continue

left.

next

= node.

next

#如果node值比前乙個值小,說明需要排序,首先斷開node節點。

#設定左右比較值,pre & post

pre = head

post = head.

next

#把node值與pre和post進行比較,主要有三種情況。

while pre != left.

next

:if node.val <= pre.val:

node.

next

= pre

head = node

break

elif pre.val < node.val <= post.val:

pre.

next

= node

node.

next

= post

break

else

: pre = post

post = post.

next

return head

其實完全可以利用前乙個插入的位置進行提速,即每次先把當前要插入的元素和前乙個插入點比較,如果比它大,那麼就從這裡開始搜尋,否則才需要從煉表頭開始搜尋。這裡也是乙個可以優化的地方。

# definition for singly-linked list.

# class listnode:

# def __init__(self, x):

# self.val = x

# self.next = none

class

solution

:def

insertionsortlist

(self, head: listnode)

-> listnode:if(

not head)or(

not head.

next):

return head

left = head

pre_insert = head

while left.

next

: node = left.

next

if node.val >= left.val:

left = left.

next

continue

left.

next

= node.

next

#這裡進行提速,本次插入的值和上一次插入的前一位置值作比較,如果node.val 大於上一次插入前的位置,那麼比較

#的起始位置就是從上一次插入的位置開始。否則就從頭開始搜尋。

if node.val > pre_insert.val:

pre = pre_insert

post = pre.

next

else

: pre = head

post = head.

next

while pre != left.

next

:if node.val <= pre.val:

node.

next

= pre

head = node

break

elif pre.val < node.val <= post.val:

pre.

next

= node

node.

next

= post

pre_insert = pre#儲存上一次插入位置

break

else

: pre = post

post = post.

next

return head

Leetcode 147 對鍊錶進行排序

對鍊錶進行插入排序。插入排序演算法 插入排序是迭代的,每次只移動乙個元素,直到所有元素可以形成乙個有序的輸出列表。每次迭代中,插入排序只從輸入資料中移除乙個待排序的元素,找到它在序列中適當的位置,並將其插入。重複直到所有輸入資料插入完為止。示例 1 輸入 4 2 1 3 輸出 1 2 3 4 到了鍊...

LeetCode 147 對鍊錶進行插入排序

插入排序演算法 插入排序是迭代的,每次只移動乙個元素,直到所有元素可以形成乙個有序的輸出列表。每次迭代中,插入排序只從輸入資料中移除乙個待排序的元素,找到它在序列中適當的位置,並將其插入。重複直到所有輸入資料插入完為止。方法1 嚴格按照演算法說明,在原始列表中進行操作,利用4個鍊錶指標分別表示當前元...

LeetCode147 對鍊錶進行插入排序

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