题目描述
对链表进行插入排序。
插入排序的动画演示如上。从第一个元素开始,该链表可以被认为已经部分排序(用黑色表示)。
每次迭代时,从输入数据中移除一个元素(用红色表示),并原地将其插入到已排好序的链表中。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/insertion-sort-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路及解答
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
/*
思路:
看代码
https://blog.csdn.net/liewen_/article/details/82926619
这里要注意head是会变的,比如最小的那个数插入到head节点之前,
辅助节点的作用就是解决了头节点变化的问题。
*/
class Solution {
public ListNode insertionSortList(ListNode head) {
if(head == null || head.next == null){
return head;
}
ListNode pre = head;//pre指向已经有序的节点
ListNode cur = head.next;//cur指向当前待排序的节点
ListNode aux = new ListNode(-1);//辅助节点
aux.next = head;
//开始排序
while(cur != null){
//如果cur指向的值小于pre指向的值,说明cur需要插入到合适的位置
if(cur.val < pre.val){
//先把cur从当前节点中删除,然后再找到合适的位置插入
pre.next = cur.next;
//使用l1和l2来找到需要插入的位置
ListNode l1 = aux;
ListNode l2 = aux.next;
while(l2.val < cur.val){
l1 = l2;
l2 = l2.next;
}
//将cur插入到l1和l2之间
l1.next = cur;
cur.next = l2;
//恢复pre和cur的位置
cur = pre.next;
}else{//如果cur指向的值大于等于pre指向的值,说明cur不需要插入到前边,cur已经在合适的位置了
pre = cur;
cur = cur.next;
}
}
return aux.next;
}
}