排序
链表
题目描述
给定单个链表的头 head
,使用 插入排序 对链表进行排序,并返回 排序后链表的头 。
插入排序 算法的步骤:
插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。
每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。
重复直到所有输入数据插入完为止。
下面是插入排序算法的一个图形示例。部分排序的列表(黑色)最初只包含列表中的第一个元素。每次迭代时,从输入数据中删除一个元素(红色),并就地插入已排序的列表中。
对链表进行插入排序。
示例 1:
输入: head = [4,2,1,3]
输出: [1,2,3,4]
示例 2:
输入: head = [-1,5,3,4,0]
输出: [-1,0,3,4,5]
提示:
列表中的节点数在 [1, 5000]
范围内
-5000 <= Node.val <= 5000
解法
方法一
Python3 Java JavaScript Go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 # Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution :
def insertionSortList ( self , head : ListNode ) -> ListNode :
if head is None or head . next is None :
return head
dummy = ListNode ( head . val , head )
pre , cur = dummy , head
while cur :
if pre . val <= cur . val :
pre , cur = cur , cur . next
continue
p = dummy
while p . next . val <= cur . val :
p = p . next
t = cur . next
cur . next = p . next
p . next = cur
pre . next = t
cur = t
return dummy . next
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 /**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode insertionSortList ( ListNode head ) {
if ( head == null || head . next == null ) {
return head ;
}
ListNode dummy = new ListNode ( head . val , head );
ListNode pre = dummy , cur = head ;
while ( cur != null ) {
if ( pre . val <= cur . val ) {
pre = cur ;
cur = cur . next ;
continue ;
}
ListNode p = dummy ;
while ( p . next . val <= cur . val ) {
p = p . next ;
}
ListNode t = cur . next ;
cur . next = p . next ;
p . next = cur ;
pre . next = t ;
cur = t ;
}
return dummy . next ;
}
}
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 /**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @return {ListNode}
*/
var insertionSortList = function ( head ) {
if ( head == null || head . next == null ) return head ;
let dummy = new ListNode ( head . val , head );
let prev = dummy ,
cur = head ;
while ( cur != null ) {
if ( prev . val <= cur . val ) {
prev = cur ;
cur = cur . next ;
continue ;
}
let p = dummy ;
while ( p . next . val <= cur . val ) {
p = p . next ;
}
let t = cur . next ;
cur . next = p . next ;
p . next = cur ;
prev . next = t ;
cur = t ;
}
return dummy . next ;
};
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 /**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func insertionSortList ( head * ListNode ) * ListNode {
if head == nil || head . Next == nil {
return head
}
dummy := & ListNode { head . Val , head }
pre , cur := dummy , head
for cur != nil {
if pre . Val <= cur . Val {
pre = cur
cur = cur . Next
continue
}
p := dummy
for p . Next . Val <= cur . Val {
p = p . Next
}
t := cur . Next
cur . Next = p . Next
p . Next = cur
pre . Next = t
cur = t
}
return dummy . Next
}