-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path147.insertion-sort-list.py
82 lines (78 loc) · 1.87 KB
/
147.insertion-sort-list.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#
# @lc app=leetcode id=147 lang=python3
#
# [147] Insertion Sort List
#
# https://leetcode.com/problems/insertion-sort-list/description/
#
# algorithms
# Medium (36.70%)
# Total Accepted: 145.9K
# Total Submissions: 395.8K
# Testcase Example: '[4,2,1,3]'
#
# Sort a linked list using insertion sort.
#
#
#
#
#
# A graphical example of insertion sort. The partial sorted list (black)
# initially contains only the first element in the list.
# With each iteration one element (red) is removed from the input data and
# inserted in-place into the sorted list
#
#
#
#
#
# Algorithm of Insertion Sort:
#
#
# Insertion sort iterates, consuming one input element each repetition, and
# growing a sorted output list.
# At each iteration, insertion sort removes one element from the input data,
# finds the location it belongs within the sorted list, and inserts it
# there.
# It repeats until no input elements remain.
#
#
#
# Example 1:
#
#
# Input: 4->2->1->3
# Output: 1->2->3->4
#
#
# Example 2:
#
#
# Input: -1->5->3->4->0
# Output: -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
# 以下处理最少有两个节点的情况
p = ret = ListNode(0) # 初始化一个链表,用于排序结果
cur = ret.next = head # 用于遍历待排序的链表
while cur and cur.next:
next_val = cur.next.val
if cur.val <= next_val:
cur = cur.next
continue
if p.next.val > next_val:
p = ret
while p.next.val <= next_val:
p = p.next
p.next, cur.next.next, cur.next = cur.next, p.next, cur.next.next
return ret.next