leetcode第22题--Merge k Sorted Lists
problem:Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
先合并两个list,再根据归并排序的方法递归合并。假设总共有k个list,每个list的最大长度是n,那么运行时间满足递推式T(k) = 2T(k/2)+O(n*k)。根据主定理,可以算出算法的总复杂度是O(nklogk)。空间复杂度的话是递归栈的大小O(logk)。
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode *mergeTwoLists(ListNode *l1, ListNode *l2) // 将两个list merge { if(!l1) return l2; if(!l2) return l1; ListNode *tmp = new ListNode(0); ListNode *ans = tmp; while(l1 && l2) { if(l1 -> val < l2 -> val) { ans -> next = l1; ans = ans -> next; l1 = l1 -> next; } else { ans -> next = l2; ans = ans -> next; l2 = l2 -> next; } } if (l1) { while(l1) { ans -> next = l1; ans = ans -> next; l1 = l1 -> next; } } if (l2) { while(l2) { ans -> next = l2; ans = ans -> next; l2 = l2 -> next; } } ans = tmp; delete ans; return tmp -> next; } ListNode *reMerge(vector<ListNode *> &lists, int l, int r) { if(l < r) // 类似于归并排序,把一大块分成l和r两块,然后将两个合并(l和r也还可以再分) { int m = (l + r)/2; return mergeTwoLists(reMerge(lists, l, m), reMerge(lists, m + 1, r)); } else return lists[l]; } ListNode *mergeKLists(vector<ListNode *> &lists) { ListNode *ans = NULL;// 用NULL 而不是利用 new ListNode(0) if (lists.size() == 0) return ans; return reMerge(lists, 0, lists.size() - 1); } };
分类:
LeetCode
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· .NET 进程 stackoverflow异常后,还可以接收 TCP 连接请求吗?
· 本地部署 DeepSeek:小白也能轻松搞定!
· 基于DeepSeek R1 满血版大模型的个人知识库,回答都源自对你专属文件的深度学习。
· 在缓慢中沉淀,在挑战中重生!2024个人总结!
· Tinyfox 简易教程-1:Hello World!
· 大人,时代变了! 赶快把自有业务的本地AI“模型”训练起来!