LeetCode 147 对链表进行插入排序 题解
每次迭代时,从输入数据中移除一个元素(用红色表示),并原地将其插入到已排好序的链表中。
插入排序算法:
插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。
每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。
重复直到所有输入数据插入完为止。
示例 1:
输入: 4->2->1->3
输出: 1->2->3->4
示例 2:
输入: -1->5->3->4->0
输出: -1->0->3->4->5
方法:
没啥技术含量,注意利用哑结点
处理头部插入的情况
从第二个节点开始比较,lastSorted是当前节点前面的链表中值最大的节点,也可以说是最靠右的节点
/**
* 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 || head.next == null){
return head;
}
//下面不会用到dummy.val,只会用到dummy.next.val
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode cur = head.next;
ListNode lastSorted = head;
while(cur != null){
//比前面一个值小才需要从头找位置进行插入
if(cur.val < lastSorted.val){
lastSorted.next = cur.next;//当前节点要往左移动了
ListNode compare = dummy;
while(compare.next.val <= cur.val){//这里应该不会出现compare == null
compare = compare.next;
}
//lastSorted不变
cur.next = compare.next;
compare.next = cur;
}
else{
lastSorted = cur;
}
cur = lastSorted.next;
}
return dummy.next;
}
}