对链表进行插入排序:
插入排序算法:
插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。
每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。
重复直到所有输入数据插入完为止。
思路: 链表的插入排序,不能像数组类的插入排序,由后往前找,所以,只能从前往后找。所以这里就当时疑惑。
所以就得从前往后,但是为了避免从大部分从前往后,维护一个尾节点,首先判断尾节点,尾节点小于当前节点,就直接插入尾节点之后,不然就从前往后找。
/**
* 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 null;
ListNode dumm = new ListNode(Integer.MIN_VALUE);
ListNode tail = head;
dumm.next = tail;
ListNode pre = dumm;
ListNode now = head.next;
while (now !=null) {
if (now.val > tail.val) {
tail.next = now;
tail = now;
now = now.next;
} else {
ListNode tmp = now.next;
while (pre.next != null && pre.next.val < now.val) pre = pre.next;
ListNode curnext = pre.next;
now.next = curnext;
pre.next = now;
tail.next = tmp;
pre = dumm;
now = tmp;
}
}
return dumm.next;
}
}