首页 > 编程语言 >【算法】【线性表】【链表】合并 K 个升序链表

【算法】【线性表】【链表】合并 K 个升序链表

时间:2024-03-12 09:12:48浏览次数:18  
标签:head ListNode 线性表 lists next 链表 rightNode 升序

1  题目

给你一个链表数组,每个链表都已经按升序排列。

请你将所有链表合并到一个升序链表中,返回合并后的链表。

示例 1:
输入:lists = [[1,4,5],[1,3,4],[2,6]]
输出:[1,1,2,3,4,4,5,6]
解释:链表数组如下:
[
  1->4->5,
  1->3->4,
  2->6
]
将它们合并到一个有序链表中得到。
1->1->2->3->4->4->5->6

示例 2:

输入:lists = []
输出:[]

示例 3:

输入:lists = [[]]
输出:[]

提示:

  • k == lists.length
  • 0 <= k <= 10^4
  • 0 <= lists[i].length <= 500
  • -10^4 <= lists[i][j] <= 10^4
  • lists[i] 按 升序 排列
  • lists[i].length 的总和不超过 10^4

2  解答

底子是基于归并排序的思想,先拆再合,最后的落点其实就是两个有序链表的合并,跟两个有序数组的合并思想差不多哈:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode mergeKLists(ListNode[] lists) {
        if (lists == null || lists.length <= 0) {
            return null;
        }
        return mergeKListsWithSpilt(lists, 0, lists.length - 1);
    }

    private ListNode mergeKListsWithSpilt(ListNode[] lists, int start, int end) {
        if (start >= end) {
            return lists[start];
        }
        // 先拆分
        int middle = start + (end - start) / 2;
        ListNode leftNode = mergeKListsWithSpilt(lists, start, middle);
        ListNode rightNode = mergeKListsWithSpilt(lists, middle + 1, end);

        // 合并两个链表
        if (leftNode == null) {
            return rightNode;
        }
        if (rightNode == null) {
            return leftNode;
        }

        // 头节点
        ListNode head = new ListNode();
        ListNode res = head;
        while (leftNode != null && rightNode != null) {
            if (leftNode.val < rightNode.val) {
                head.next = leftNode;
                leftNode = leftNode.next;
            } else {
                head.next = rightNode;
                rightNode = rightNode.next;
            }
            head = head.next;
        }

        while (leftNode != null) {
            head.next = leftNode;
            head = head.next;
            leftNode = leftNode.next;
        }

        while (rightNode != null) {
            head.next = rightNode;
            head = head.next;
            rightNode = rightNode.next;
        }
        return res.next;
    }
}

加油。

标签:head,ListNode,线性表,lists,next,链表,rightNode,升序
From: https://www.cnblogs.com/kukuxjx/p/18067554

相关文章

  • 排序链表(自底向上归并排序)
    题目:时间复杂度:O(nlogn),空间复杂度:O(1)structListNode{intval;ListNode*next;ListNode():val(0),next(nullptr){}ListNode(int_val):val(_val),next(nullptr){}ListNode(int_val,ListNode*_next):val(_val),next(_next){}};class......
  • 洛谷题单指南-线性表-P1160 队列安排
    原题链接:https://www.luogu.com.cn/problem/P1160题意解读:本题是双向链表的模拟题,要快速实现M个节点的删除,用数组模拟链表是最佳做法。解题思路:双向链表关键要实现好两个操作:voidadd(intk,intv);//在第k个节点后增加第v的号节点,即在k号同学右边插入v号同学voiddel(int......
  • 洛谷题单指南-线性表-P1996 约瑟夫问题
    原题链接:https://www.luogu.com.cn/problem/P1996题意解读:约瑟夫问题是队列的典型应用。解题思路:n个人围圈报数,可以直接基于数组实现循环队列操作,再定义额外数组记录每个人是否已经出圈即可。更直观的做法,定义队列,初始放入1~n,然后重复n次,每次从1~m报数,如果报数到m,直接出队,......
  • leedcode 反转链表
    自己写的,遍历一遍链表,再反向生成一个新链表classSolution:defreverseList(self,head:Optional[ListNode])->Optional[ListNode]:#检查链表是否为空ifnothead:returnNone#初始化一个空列表,用于存储原始链表节点的值......
  • 洛谷题单指南-线性表-P3613 【深基15.例2】寄包柜
    原题链接:https://www.luogu.com.cn/problem/P3613题意解读:此题很容易想成用二维数组求解,但是最多有10^5*10^5个寄包柜格子,二维数据会爆空间,题目明确各自一共不超过10^7,所以需要动态数据结构vector。解题思路:vector的问题在于需要提前明确空间大小,才能进行随即访问操作,否则可......
  • 洛谷题单指南-线性表-P3156 【深基15.例1】询问学号
    原题链接:https://www.luogu.com.cn/problem/P3156解题思路:简单的数组题,唯一需要注意的是读写的数据量比较大,输入输出最好用scanf、printf100分代码:#include<bits/stdc++.h>usingnamespacestd;constintN=2e6+5;inta[N],n,m;intmain(){scanf("%d%d",&......
  • 判断链表回文
    题目://方法一,空间复杂度O(n)classSolution{public:boolisPalindrome(ListNode*head){vector<int>nums;//放进数组后用双指针判断ListNode*cur=head;while(cur){nums.emplace_back(cur->val);cur=......
  • 探索数据结构:单链表的实战指南
    ✨✨欢迎大家来到贝蒂大讲堂✨✨......
  • 代码随想录算法训练营第四天| 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点
    24.两两交换链表中的节点https://leetcode.cn/problems/swap-nodes-in-pairs/description/publicListNodeswapPairs(ListNodehead){if(head==null||head.next==null)returnhead;ListNoderes=head.next;ListNodepre=newListNod......
  • leedcode-移除链表元素
    自己写的:#Definitionforsingly-linkedlist.#classListNode:#def__init__(self,val=0,next=None):#self.val=val#self.next=nextclassSolution:defremoveElements(self,head:Optional[ListNode],val):#初始化一个......