p122 合并 K 个有序链表(leetcode 23)
时间:2020-04-13
本文章向大家介绍p122 合并 K 个有序链表(leetcode 23),主要包括p122 合并 K 个有序链表(leetcode 23)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
一:解题思路
方法一:之前做过一道合并2个链表的题目,那么第一种方法就是将数组中的链表两两合并,得到最后的结果。Time:O(k*n),Space:O(1)
方法二:采用分治法,两两合拼。不断递归,最后只剩下一个链表。Time:O(n*log(k)),Space:O(log(k))
二:完整代码示例 (C++版和Java版)
方法一C++:
class Solution { private: ListNode* mergeTwoSortedLists(ListNode* l1, ListNode* l2) { ListNode* dummy = new ListNode(0); ListNode* p = dummy; while (l1 != NULL && l2 != NULL) { if (l1->val < l2->val) { p->next = l1; l1 = l1->next; } else { p->next = l2; l2 = l2->next; } p = p->next; } if (l1 != NULL) p->next = l1; if (l2 != NULL) p->next = l2; return dummy->next; } public: ListNode* mergeKLists(vector<ListNode*>& lists) { if (lists.size() == 0) return NULL; ListNode* result = NULL; for (ListNode* list : lists) { result = mergeTwoSortedLists(result,list); } return result; } };
方法一Java:
class Solution { private ListNode mergeTwoSortedLists(ListNode l1,ListNode l2) { ListNode dummy=new ListNode(0); ListNode p=dummy; while (l1!=null && l2!=null) { if(l1.val<l2.val) { p.next=l1; l1=l1.next; } else { p.next=l2; l2=l2.next; } p=p.next; } if(l1!=null) p.next=l1; if(l2!=null) p.next=l2; return dummy.next; } public ListNode mergeKLists(ListNode[] lists) { if(lists==null || lists.length==0) return null; ListNode result=null; for(ListNode list:lists) { result=mergeTwoSortedLists(result,list); } return result; } }
方法二C++:
class Solution { private: ListNode* mergeTwoSortedList(ListNode* l1, ListNode* l2) { ListNode* dummy = new ListNode(0); ListNode* p = dummy; while (l1 != NULL && l2 != NULL) { if (l1->val < l2->val) { p->next = l1; l1 = l1->next; } else { p->next = l2; l2 = l2->next; } p=p->next; } if (l1 != NULL) p->next = l1; if (l2 != NULL) p->next = l2; return dummy->next; } ListNode* merge(vector<ListNode*>& lists, int start, int end) { if (start == end) return lists[start]; if (start > end) return NULL; int mid = start + (end-start) / 2; ListNode* left = merge(lists,start,mid); ListNode* right = merge(lists,mid+1,end); return mergeTwoSortedList(left,right); } public: ListNode* mergeKLists(vector<ListNode*>& lists) { if (lists.size() == 0) return NULL; return merge(lists,0,lists.size()-1); } };
方法二Java:
class Solution { private ListNode mergeTwoSortedList(ListNode l1,ListNode l2) { ListNode dummy=new ListNode(0); ListNode p=dummy; while (l1!=null && l2!=null) { if(l1.val<l2.val) { p.next=l1; l1=l1.next; } else { p.next=l2; l2=l2.next; } p=p.next; } if(l1!=null) p.next=l1; if(l2!=null) p.next=l2; return dummy.next; } private ListNode merge(ListNode[] lists,int start,int end) { if(start==end) return lists[start]; if(start>end) return null; int mid=start+(end-start)/2; ListNode left=merge(lists,start,mid); ListNode right=merge(lists,mid+1,end); return mergeTwoSortedList(left,right); } public ListNode mergeKLists(ListNode[] lists) { if(lists==null || lists.length==0) return null; return merge(lists,0,lists.length-1); } }
原文地址:https://www.cnblogs.com/repinkply/p/12694187.html
- Java中的String类能否被继承?为什么?
- Mybatis【与Spring整合】
- 使用logon trigger完成动态的session跟踪(r4笔记第29天)
- struts2关于action拦截器使用方法 现记录如下
- Struts2【入门】
- 通过ORA错误反思sql语句规范(r4笔记第41天)
- 算法01 七大排序之:冒泡排序和快速排序
- 自下向上的编写容易阅读的代码(上)
- Hibernate【inverse和cascade属性】知识要点
- 算法02 七大排序之:直接选择排序和堆排序
- Hibernate【映射】续篇
- Java基础-11总结Eclipse使用,API,Object类
- Hibernate【映射】知识要点
- 算法03 七大排序之:直接插入排序和希尔排序
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Design - 381. Insert Delete GetRandom O(1) - Duplicates allowed
- Design - 380. Insert Delete GetRandom O(1)
- DFS&BFS - 52. N-Queens II
- DFS&BFS - 51. N-Queens
- maze - dfs
- DFS&BFS - 130. Surrounded Regions
- Tree - 145. Binary Tree Postorder Traversal
- Tree - 94. Binary Tree Inorder Traversal
- Tree - 144. Binary Tree Preorder Traversal
- grpc调用主要流程分析(一)
- Array - 42. Trapping Rain Water Hard
- Go modules 简介
- Spring事务的传播行为
- String - 71. Simplify Path
- 性能测试工具——wrk