给定单个链表的头 head
,使用 插入排序 对链表进行排序,并返回 排序后链表的头 。
插入排序 算法的步骤:
- 插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。
- 每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。
- 重复直到所有输入数据插入完为止。
下面是插入排序算法的一个图形示例。部分排序的列表(黑色)最初只包含列表中的第一个元素。每次迭代时,从输入数据中删除一个元素(红色),并就地插入已排序的列表中。
对链表进行插入排序。
示例 1:
输入: head = [4,2,1,3]
输出: [1,2,3,4]
示例 2:
输入: head = [-1,5,3,4,0]
输出: [-1,0,3,4,5]
提示:
- 列表中的节点数在
[1, 5000]
范围内 -5000 <= Node.val <= 5000
题解:
/**
* @description: 迭代法 TC:O(n^2) SC:O(1)
* @author: JunLiangWang
* @param {*} head 给定链表头节点
* @return {*}
*/
function iteration(head){
/**
* 这题咋看比较简单,但在具体写得时候有很多需要注意得地方,
* 比对交换两节点指针不能指向当前需要交换的两节点,而是指向
* 其上一个节点通过next来访问,因为移动节点需要改变其上一个
* 节点的next值
*/
if(!head)return head
const HEAD=new ListNode(0,head)
let selectNode=HEAD;
while(selectNode.next){
let compareNode=HEAD,isChange=false;
// 遍历比对节点
while(compareNode.next&&compareNode.next!=selectNode.next){
// 如果大于则需要移动节点
if(compareNode.next.val>selectNode.next.val){
let nextNode=selectNode.next.next
selectNode.next.next=compareNode.next
compareNode.next=selectNode.next
selectNode.next=nextNode
isChange=true;
break;
}
compareNode=compareNode.next
}
if(!isChange)selectNode=selectNode.next
}
return HEAD.next
}
来源:力扣(LeetCode)