插入排序的动画演示如上。从第一个元素开始,该链表可以被认为已经部分排序(用黑色表示)。每次迭代时,从输入数据中移除一个元素(用红色表示),并原地将其插入到已排好序的链表中
插入排序算法想必大家都不陌生了,如果不了解的话来看看下面这篇博客吧
难点在于这是个单向链表,不能向数组一样直接从后往前遍历,因此我们每找到一个不符合排序规则的元素,都必须从头再遍历,找到合适的插入点,而这又考察到有关链表的操作
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode insertionSortList(ListNode head) {
if(head == null) {
return head;
}
ListNode dummyHead = new ListNode(-1);
dummyHead.next = head;
ListNode lastNode = head, curNode = head.next;
while(curNode != null) {
if(lastNode.val <= curNode.val) {
lastNode = lastNode.next;
} else {
ListNode preNode = dummyHead;
while(preNode.next.val <= curNode.val) {
preNode = preNode.next;
}
lastNode.next = curNode.next;
curNode.next = preNode.next;
preNode.next = curNode;
}
curNode = lastNode.next;
}
return dummyHead.next;
}
}
原文:https://www.cnblogs.com/Yee-Q/p/14012924.html