首页 > 其他分享 >合并 K 个升序链表(归并排序)

合并 K 个升序链表(归并排序)

时间:2024-12-23 18:11:15浏览次数:8  
标签:pre 归并 ListNode int lists next 链表 升序

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

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

示例 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 = [[]]
输出:[]

思路:这一道题与排序链表(归并排序)的思路极其相似,排序的对象由节点变为链表(链表有序)

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* mergeTwoLists(ListNode *list1,ListNode* list2){
        ListNode *pre = new ListNode();
        ListNode *head = pre;
        ListNode *p = list1;
        ListNode *q = list2;
        while(p&&q){
            if(p->val<q->val){
                pre->next = p;
                pre=p;
                p = p->next;
            }else{
                pre->next = q;
                pre=q;
                q = q->next;
            }
        }
        if(p){
            pre->next = p;
        }
        if(q){
            pre->next = q;
        }
        return head->next;
    }
    ListNode* mergeKLists(vector<ListNode*>& lists,int start,int end){
        //归并排序
        if(start==end){
            return lists[start];
        }
        int mid = start + (end-start)/2;
        return mergeTwoLists(mergeKLists(lists,start,mid),mergeKLists(lists,mid+1,end));
    }
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        int n = lists.size();
        //特殊情况处理
        if(n==0) return nullptr;
        return mergeKLists(lists,0,n-1);
    }
};

 

标签:pre,归并,ListNode,int,lists,next,链表,升序
From: https://www.cnblogs.com/yueshengd/p/18624709

相关文章

  • LeetCode《图解算法数据结构》链表:图书整理 I
    题目书店店员有一张链表形式的书单,每个节点代表一本书,节点中的值表示书的编号。为更方便整理书架,店员需要将书单倒过来排列,就可以从最后一本书开始整理,逐一将书放回到书架上。请倒序返回这个书单链表。输入head=[3,6,4,1]输出[1,4,6,3]解法1:递归classSolution{public......
  • 排序算法 (插入,选择,冒泡,希尔,快速,归并,堆排序)
    排序:经常在算法题中作为一个前置操作,为了之后的贪心orelse做个铺垫,虽然我们经常都只是调用个sort,但是了解一些排序算法可以扩充下知识库排序的分类:从存储设备角度:✓内排序:在排序过程中所有数据元素都在内存中;✓外排序:当待排序元素所占空间大到内存存不下时,排序......
  • 【数据结构练习题】顺序表与链表LinkedList
    顺序表与链表LinkedList选择题链表面试题1.删除链表中等于给定值val的所有节点。2.反转一个单链表。3.给定一个带有头结点head的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。4.输入一个链表,输出该链表中倒数第k个结点。5.将两个有......
  • 算法——排序算法(冒泡、选择、归并、堆排序)
    排序算法——冒泡排序(BubbleSort)排序算法——选择排序(SelectionSort)排序算法——插入排序(InsertionSort)排序算法——堆排序(HeapSort)排序算法——归并排序(MergeSort)......
  • 12.22 归并排序
    includeusingnamespacestd;constintMAXN=10;intn,a[MAXN],b[MAXN];voidmergesort(int*a,intl,intr){inti,j,mid,cnt;if(l==r){return;//TODO}mid=(l+r)/2;mergesort(a,l,mid);mergesort(a;mid+1;r)i=l,j=mid+1,cnt=......
  • 【LeetCode: 141. 环形链表 + 链表】
    ......
  • 排序链表(归并排序)
    给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。 示例1:输入:head=[4,2,1,3]输出:[1,2,3,4]示例2:输入:head=[-1,5,3,4,0]输出:[-1,0,3,4,5]示例3:输入:head=[]输出:[] 方法一:归并排序/***Definitionforsingly-linkedlist.*s......
  • 随机链表的复制(哈希表)
    给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都......
  • K 个一组翻转链表(逆置链表+递归)
    给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。 示例1:输入:head......
  • 两两交换链表中的节点(迭代)
    给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即只能进行节点交换)。 示例1:输入:head=[1,2,3,4]输出:[2,1,4,3]示例2:输入:head=[]输出:[]示例3:输入:head=[1]输出:[1] /***Definitionforsing......