对链表进行插入排序
问题:对链表进行插入排序。
分析
既然问题这样描述,就要考察我们对链表的熟悉程度。其过程必须按照插入排序的方式,否则没有啥意义。
思路:按照插入排序的思路,利用指针找到当前元素该插入的位置 利用head和rear两个指针维护已经排好序的链表。
Code
java代码,有详细注释。
class Solution {
/*
执行结果:
通过
显示详情
执行用时:23 ms, 在所有 Java 提交中击败了34.47% 的用户
内存消耗:37.7 MB, 在所有 Java 提交中击败了99.13% 的用户
思路:按照插入排序的思路,利用指针找到当前元素该插入的位置
利用head和rear两个指针维护已经排好序的链表
*/
public ListNode insertionSortList(ListNode head) {
// flag用来记录已经排好的节点的个数
int flag = 1;
ListNode rear = head;
if (head == null) return head;
while (rear.next != null) {
ListNode insertNode = rear.next;
// 将node后移
rear.next = insertNode.next;
// 寻找第一个大于插入节点值的节点, count负责记录节点数
int count = 0;
// 一般情况
ListNode cur = head, pre = cur;
// 寻找节点
while (count < flag && insertNode.val > cur.val) {
pre = cur;
cur = cur.next;
count++;
}
// 如果新插入的节点是在头部,则更新头结点
if (count == 0) {
insertNode.next = head;
head = insertNode;
// 插在尾部和插在中间的插入操作是一样的
} else {
pre.next =insertNode;
insertNode.next = cur;
}
// 如果是插入在尾部,则更新尾结点
if (count == flag) rear = insertNode;
flag++;
}
return head;
}
}