2026/3/5 22:57:14
网站建设
项目流程
做冰淇淋生意网站,律师推广网站排名,自己做网站需要什么条件,成都网站托管思路#xff1a;采用了暴力破解法1.值收集#xff1a;遍历 K 个链表的所有节点#xff0c;将节点值存入数组#xff0c;把 “链表的有序合并” 转化为 “数组的排序”#xff1b;
2.数组排序#xff1a;利用系统排序函数对存储节点值的数组进行升序排序#xff0c;得到全…思路采用了暴力破解法1.值收集遍历 K 个链表的所有节点将节点值存入数组把 “链表的有序合并” 转化为 “数组的排序”2.数组排序利用系统排序函数对存储节点值的数组进行升序排序得到全局有序的数值序列3.链表重建以排序后的数组为基础逐个创建链表节点并拼接生成最终的升序链表。创建一个整型数组用于存放 链表中所有节点的数值。链表的优势是 “动态插入删除”但此处我们需要全局排序数组的随机访问和排序操作更高效、更易实现。外层循环遍历输入的 lists 数组lists 中每个元素是一个链表的头指针head 代表当前遍历到的链表的头节点。逐个处理 K 个链表确保没有遗漏任何一个链表。内层循环定义指针初始指向当前链表的头节点用于遍历该链表的所有节点。循环条件 只要指针不指向空即未到链表末尾就继续遍历将当前节点的数值 val 存入数组。然后指针向后移动一位指向链表的下一个节点直到遍历到链表末尾。排序。然后定义虚拟头节点避免处理空链表的特殊情况同时无需单独处理第一个节点的头指针赋值 问题所有新节点都可以统一拼接到 dummy 之后定义指针 p初始指向虚拟头节点 dummy作为移动指针负责逐个拼接新创建的链表节点避免频繁修改头指针。最后返回dummy.next因为dummy是虚拟头节点他的后一个才是真正的头节点时间复杂度O(NlogN)遍历所有节点收集值O(N)N 为所有节点的总数每个节点仅访问一次数组排序O(NlogN)sort 函数的时间复杂度重建链表O(N)每个数值仅创建一次节点总复杂度由最高项决定即 O(NlogN)。class Solution {public:ListNode* mergeKLists(vectorListNode* lists) {//用listnode表示链表时ListNode * 默认代表链表头vectorint a;for(ListNode* head:lists){//外层循环遍历lists数组中每个链表的头指针ListNode* phead;while(p!nullptr){//内层循环遍历当前链表的每个节点到链表末尾a.push_back(p-val);pp-next;}}sort(a.begin(),a.end());ListNode dummy(0);//创建一个虚拟头节点ListNode* qdummy;for(int b:a){q-nextnew ListNode(b); //用当前数值创建新节点接在q指针之后qq-next;}return dummy.next;}};这个方法的核心是通过收集所有节点值→排序数组→重建链表的三步操作把合并 K 个有序链表转化为更易实现的数组操作。它的优势是思路直观、代码好写用数组排序规避了复杂的链表指针操作虚拟头节点还能处理空链表等边界情况缺点是需要额外数组空间时间复杂度为O(NlogN)N 是总节点数适合小规模数据或快速实现的场景。