力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
给定单个链表的头
head
,使用 插入排序 对链表进行排序,并返回 排序后链表的头 。插入排序 算法的步骤:
- 插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。
- 每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。
- 重复直到所有输入数据插入完为止。
下面是插入排序算法的一个图形示例。部分排序的列表(黑色)最初只包含列表中的第一个元素。每次迭代时,从输入数据中删除一个元素(红色),并就地插入已排序的列表中。
解题思路:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
代码如下:
class Solution {
public ListNode insertionSortList(ListNode head) {
if(head == null) {
return head;
}
ListNode dummy = new ListNode(0);
dummy.next = head;
//排好序的最后一个节点
ListNode cur = head;
//待插入的节点
ListNode tmp = cur.next;
while(tmp != null) {
if(cur.val <= tmp.val) {
cur = cur.next;
}
else {
//如果tmp.val > cur.val,则从头节点开始寻找插入的位置
ListNode pre = dummy;
while(pre.next.val <= tmp.val){
pre = pre.next;
}
//找到插入位置后,进入插入操作(这个插入操作不会影响cur的位置)
cur.next = tmp.next;
tmp.next = pre.next;
pre.next = tmp;
}
tmp = cur.next;
}
return dummy.next;
}
}