对链表进行插入排序|刷题打卡

105 阅读1分钟

每日算法 -- 链表

147. 对链表进行插入排序

147. 对链表进行插入排序

分析

  1. 遍历过程中,write 指针都指向当前链表之前最大的那个值,所以当 read 指针读到了小于 write 指针的是,需要作出删除插入的操作
  2. 首先write 指针就是 read 的前一个指针,所以很容易就能删除当前的 read 指针
  3. 然后找到插入点,这里如果是双向指针,可以从尾到前查找,当然也可以从 head 开始查找
  4. 从起始 head 节点开始查找比当前 read 指针值大的节点,在它之前插入
  5. 最后得到链表就是所求
  6. 在遍历的过程中反复遍历,时间复杂度应该是 0(nlogn)0(nlogn)
// 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 春招闯关活动」, 点击查看 活动详情