1. 对链表进行插入排序
public class SortList147 {
//定义一个单链表
public class ListNode {
int val; //当前节点值
ListNode next; //下一个节点值
//构造方法 初始化当前节点值
ListNode(int x) {
val = x;
next = null;
}
}
//对链表进行插入排序 时间复杂度 O(n^2)
public ListNode insertionSortList(ListNode head) {
//链表为空
if (head == null || head.next == null) return head;
//创造一个新的链表头部 哑元节点
ListNode pre = new ListNode(0);
//用一个临时变量保存头节点
ListNode ans = pre;
//cur是原链表上的指针
ListNode cur = head;
while (cur != null) {
//每次循环前重置pre为头结点,这样保证每次都从头往后遍历
pre = ans;
//当pre.next.val不为空且大于cur.val时停止循环
while (pre.next != null && pre.next.val < cur.val) {
pre = pre.next;
}
//pre.next.val 大于 cur.val,此时应该把cur插入到pre后
//保存原链表当前节点的下一节点
ListNode tmp = cur.next;
//把cur插入到pre之后
cur.next = pre.next;
pre.next = cur;
//cur指针后移一位
cur = tmp;
}
return ans.next;
}
}
图解:
2. LeetCode代码测试