每日算法 -- 链表
147. 对链表进行插入排序
分析
- 遍历过程中,write 指针都指向当前链表之前最大的那个值,所以当 read 指针读到了小于 write 指针的是,需要作出删除插入的操作
- 首先write 指针就是 read 的前一个指针,所以很容易就能删除当前的 read 指针
- 然后找到插入点,这里如果是双向指针,可以从尾到前查找,当然也可以从 head 开始查找
- 从起始 head 节点开始查找比当前 read 指针值大的节点,在它之前插入
- 最后得到链表就是所求
- 在遍历的过程中反复遍历,时间复杂度应该是
// 147. 对链表进行插入排序
// https://leetcode-cn.com/problems/insertion-sort-list/
var insertionSortList = function(head) {
if(!head || !head.next) return head
let emptyNode = new ListNode()
emptyNode.next = head
let write = head
let read =write.next
while(read){
if(read.val<write.val){
// 先删除
let next = read.next
write.next = next
// 从empty指针开始,查找要插入的位置
let prev = emptyNode
let temp = emptyNode.next
while(temp.val<=read.val){
temp = temp.next
prev = prev.next
}
// 插入到 temp 之前
prev.next = read
read.next = temp
read = next
}else{
read = read.next
write=write.next
}
}
return emptyNode.next
};
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情