首页 > 其他分享 >LeetCode:23.合并K个排序链表

LeetCode:23.合并K个排序链表

时间:2025-01-14 23:00:30浏览次数:1  
标签:return 23 len next 链表 heap ind LeetCode

LeetCode:23.合并K个排序链表

解题思路新链表的下一个节点一定是k个链表头中的最小节点。考虑选择使用最小堆。

解题步骤构建一个最小堆,并依次把链表头插入堆中。弹出堆顶接到输出链表,并将堆顶所在链表的新链表头插入堆中。等堆元素全部弹出,合并工作就完成了。

class MinHeap {
    constructor() {
      this.heap = []
      this.len = 0
    }
    size() {
      return this.len
    }
    push(val) {
      this.heap[++this.len] = val
      this.swin(this.len)
    }
  
    pop() {
      if(this.top()===1) return this.heap.shift(1);
      const ret = this.heap[1]
      this.swap(1, this.len--)
      this.heap[this.len + 1] = null
      this.sink(1)
      return ret
    }
    swin(ind) {
      while (ind > 1 && this.less(ind, parseInt(ind / 2))) {
        this.swap(ind, parseInt(ind / 2))
        ind = parseInt(ind / 2)
      }
    }
    sink(ind) {
      while (ind * 2 <= this.len) {
        let j = ind * 2
        if (j < this.len && this.less(j + 1, j)) j++
        if (this.less(ind, j)) break
        this.swap(ind, j)
        ind = j
      }
    }
    top() {
      return this.heap[1]
    }
    isEmpty() {
      return this.len === 0
    }
  
    swap(i, j) {
      [this.heap[i], this.heap[j]] = [this.heap[j], this.heap[i]]
    }
    less(i, j) {
      return this.heap[i].val < this.heap[j].val
    }
    getHeap() {
      return this.heap
    }
  }
/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode[]} lists
 * @return {ListNode}
 */
var mergeKLists = function(lists) {
    if(!lists) return;
    let root=new ListNode(0);
    let h=new MinHeap()
    lists.forEach(n=>n&&h.push(n))
    let n;
    let p=root
    while(h.size()){
        n=h.pop();
        p.next=n
        p=p.next
        if(n.next)h.push(n.next)
    }
    return root.next
};

'

标签:return,23,len,next,链表,heap,ind,LeetCode
From: https://www.cnblogs.com/KooTeam/p/18671872

相关文章

  • LeetCode:347.前K个高频元素
    LeetCode:347.前K个高频元素vartopKFrequent=function(nums,k){letmap=newMap();letarr=[...newSet(nums)]nums.forEach(item=>{if(map.has(item)){map.set(item,map.get(item)+1)}else{map.set(item,1)......
  • LeetCode:40.组合总和II
    跟着carl学算法,本系列博客仅做个人记录,建议大家都去看carl本人的博客,写的真的很好的!代码随想录LeetCode:40.组合总和II给定一个候选人编号的集合candidates和一个目标数target,找出candidates中所有可以使数字和为target的组合。candidates中的每个数字在每......
  • 12.23日报
    今天进行了软件需求分析的测试,以下为测试内容:软件需求与分析课堂测试          答题纸班级:信2205-3          学号:20223768           姓名:李健龙1.  需求定义(1).系统工作上下范围图  (2).业务流程图  2.(1).功能结构图 (2......
  • LeetCode - #183 Swift 实现查询未下订单的客户
    网罗开发(小红书、快手、视频号同名)  大家好,我是展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、HarmonyOS、Java、Python等方向。在移动端开发、鸿蒙开发、物联网、嵌入式、云原生、开源......
  • 【LeetCode 刷题】二分搜索
    此博客作为《代码随想录》的学习笔记,主要内容为二分搜索法及相关题目解析。文章目录704.二分查找35.搜索插入位置34.在排序数组中查找元素的第一个和最后一个位置69.x的平方根367.有效的完全平方数以下所有二分法算法均基于左闭右闭区间704.二分查找LeetCode......
  • 数据结构-链表 day 2
    数据结构-链表单链表一般在算法里面都是采用的静态链表,动态链表单链表一般就是邻接表,包括存储树与图双链表一般是优化某些问题的一下是动态链表与静态链表之间的区别.内存分配方式•静态链表:•静态链表通常是基于一个固定大小的数组来实现的。链表中的每个结点在数......
  • STM32H723 ADC 差分与单端转换
    1、配置ADC2、配置DMA 3、DMA转换数据到数组/*USERCODEBEGINHeader_StartTaskModbus*/#defineADC_BUFFER_SIZE8//根据规则通道数调整uint32_tadc_buffer[ADC_BUFFER_SIZE];//ADC采样结果缓冲区/***@briefFunctionimplementingthemyTaskModbusthrea......
  • Oracle 23ai新特性:使用列别名的 GROUP BY 和 HAVING 子句
    摘要随着数据库技术的不断发展,SQL语言也在不断进化,以更好地满足数据查询和分析的需求。本文将探讨如何在SQL查询中使用列别名(columnalias)或列位置(columnposition)来简化GROUPBY和HAVING子句,并提高查询的可读性和维护性。一、引言在SQL查询中,GROUPBY子句用于将......
  • leetcode 刷题
    现有一个记作二维矩阵 frame 的珠宝架,其中 frame[i][j] 为该位置珠宝的价值。拿取珠宝的规则为:只能从架子的左上角开始拿珠宝每次可以移动到右侧或下侧的相邻位置到达珠宝架子的右下角时,停止拿取注意:珠宝的价值都是大于0的。除非这个架子上没有任何珠宝,比如 frame=[......
  • LeetCode:215.数组中的第K个最大元素
    LeetCode:215.数组中的第K个最大元素解题思路看到“第K个最大元素”。考虑选择使用最小堆。解题步骤构建一个最小堆,并依次把数组的值插入堆中。当堆的容量超过K,就删除堆顶。插入结束后,堆顶就是第K个最大元素。leetcode在线运行测试可能是用本地环境跑分...有缓存卡大数有er......