首页 > 其他分享 >合并k个已排序的链表

合并k个已排序的链表

时间:2023-05-06 13:33:34浏览次数:45  
标签:pre ListNode val 合并 next 链表 return 排序

  • 描述
合并 k 个升序的链表并将结果作为一个升序的链表返回其头节点。   数据范围:节点总数 0≤n≤5000,每个节点的val满足∣val∣<=1000 要求:时间复杂度 O(nlogn)  
  • 示例
输入:[{1,2},{1,4,5},{6}] 返回值:{1,1,2,4,5,6}  
  • 算法思想
1、将k个链表两两进行合并(采用顺序合并的方法),这一过程的代码和合并两个排序的链表的过程一致,可以直接套用 2、第一轮合并后,k个链表合并成了 k/2 个链表 3、重复这一过程,然后是 k/4、k/8、...1个链表,从而可以获取最终的有序链表  
  • 代码
 1 /**
 2  * Definition for singly-linked list.
 3  * struct ListNode {
 4  *     int val;
 5  *     ListNode *next;
 6  *     ListNode(int x) : val(x), next(NULL) {}
 7  * };
 8  */
 9 class Solution {
10   public:
11     //合并两个链表
12     ListNode* merge(ListNode* pHead1, ListNode* pHead2) {
13         ListNode* pre = nullptr;
14         ListNode* p = pHead1;
15         ListNode* q = pHead2;
16         //特殊情况判断
17         if (pHead1 == nullptr)  return pHead2;
18         if (pHead2 == nullptr)  return pHead1;
19         //L2合并至L1
20         if (q->val >= p->val) {
21             while (p && q) {
22                 if (q->val >= p->val) {
23                     pre = p;
24                     p = pre->next;
25                 } else {
26                     ListNode* r = q->next;
27                     q->next = p;
28                     pre->next = q;
29                     pre = q;
30                     q = r;
31                 }
32             }
33 
34             if (q) {
35                 pre->next = q;
36             }
37             return pHead1;
38         } else {          //L1合并至L2
39             while (p && q) {
40                 if (p->val >= q->val) {
41                     pre = q;
42                     q = pre->next;
43                 } else {
44                     ListNode* r = p->next;
45                     p->next = q;
46                     pre->next = p;
47                     pre = p;
48                     p = r;
49                 }
50             }
51             if (p) {
52                 pre->next = p;
53             }
54             return pHead2;
55         }
56     }
57      // 分治进行链表两两合并
58     ListNode* mergeList(vector<ListNode*>& lists, int l, int r) {
59 
60         if (l == r) return lists[l];
61         if (l > r) return nullptr;
62 
63         int mid = (l + r) / 2;
64 
65         return merge(mergeList(lists, l, mid), mergeList(lists, mid + 1, r));
66     }
67 
68     ListNode* mergeKLists(vector<ListNode*>& lists) {
69         //采用分治法进行合并
70         return mergeList(lists, 0, lists.size() - 1);
71     }
72 };

 

标签:pre,ListNode,val,合并,next,链表,return,排序
From: https://www.cnblogs.com/yueshengd/p/17376988.html

相关文章

  • 集合、序列、链表进行过滤排序
    C#有Linq对list等数据的排序过滤等操作java有stream()php也有第三方库phpLinq,或array_filter()、array_search()、array_map()等也行。.....------------它们都是,配合一个方法或函数(可以匿名函数和lambda表达式),进行过滤. 相关:  https://www.bilibili.com/video/BV1B5......
  • PostgreSQL数据库支持中文拼音和笔画排序
    PostgreSQL数据库支持中文拼音和笔画排序1.前言默认安装,PG是不支持中文拼音和笔画排序的。1postgres=# select * from pg_settings where name ~ 'collate';2    name    | setting | unit |    category    |            short_d......
  • Java8 Stream流的合并
    最近的需求里有这样一个场景,要校验一个集合中每个对象的多个Id的有效性。比如一个Customer对象,有3个Id:id1,id2,id3,要把这些Id全部取出来,然后去数据库里查询它是否存在。@Data@AllArgsConstructorpublicclassCustomer{privateStringname;privateStringid1;p......
  • 单链表
    单链表的每个结点,包含值和链接到下一个结点的引用字段。//definitionforsingly-linkedlist.structSinglyListNode{intval;SinglyListNode*next;SinglyListNode(intx):val(x),next(Null){}//用头结点来表示整个列表};与数组不同,我们无法在常量时间内访......
  • LeetCode 206. 反转链表
    题目链接:LeetCode206.反转链表本题是链表题目中非常重要的一道题目--反转指针。解题方法有两种:1.双指针法2.递归法首先看双指针法:快指针总是在慢指针的前面,也就是每次将快指针的节点的next指针更新成指向慢指针,这样不就进行了反转嘛。完整代码如下:funcreverseList(hea......
  • LeetCode 203. 移除链表元素
    题目链接:LeetCode203.移除链表元素本题是一个经典的单链表删除元素的题目,主要注意的有两点:如果删除的元素是不是头元素,则直接p.Next=p.Next.Next即可如果删除的元素是头元素,则需要进行单独的处理forhead!=nil&&head.Val==val{head=head.Next}ifh......
  • Python+Pandas批量合并大量excel文件
    requirments.txtet-xmlfile==1.1.0numpy==1.24.3openpyxl==3.1.2pandas==2.0.1python-dateutil==2.8.2pytz==2023.3six==1.16.0tzdata==2023.3main.pyimportosimportpandasaspddir_path=os.path.dirname(os.path.abspath(__file__))source_location=o......
  • 修改数据库实例、修改数据库、修改数据表、修改数据,编码、排序规则
    查实例字符集showvariableslike'%character%';查实例排序规则showvariableslike'%collation%';查库语句showcreatedatabasetest;查表排序规则showtablestatusfromtestlike'test_saas_single';查字段排序规则showfullcolumnsfromtest_saas_single;......
  • 二次开发项目之合并项目代码
    二次开发项目,并需要不时的接收外部的bug修复代码,合并起来其实停头疼的一方面是自己在上之上开发了不少新功能,与其原公司的代码相当于走在了2条路上另一方面是其原公司还在维护修复反馈的bug,就导致每次给的patch和code,都需要仔细核对一遍(存在给patch和code对不上的问题......
  • C# iTextSharp,将多张图片合并生成PDF文件
    1、添加引用首先添加NuGet引用 2、界面实现及按钮事件///<summary>///根据图片生成PDF///</summary>///<paramname="sender"></param>///<paramname="e"></param>privatev......