LeetCode 腾讯精选50题--合并K个排序链表
时间:2019-08-06
本文章向大家介绍LeetCode 腾讯精选50题--合并K个排序链表,主要包括LeetCode 腾讯精选50题--合并K个排序链表使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
今天的题目稍微有点复杂了,因为是K个有序链表的合并,看到这道题后的大体思路是这样的:
1.首先先做到两个链表的合并,链表的合并我想到的是用递归操作,
2.其次是多个链表的合并,所以在第一步实现的基础上,我考虑每次选择两个链表进行合并,一个链表数组作为一个整体,那么就可以采用归并算法进行合并,利用两个指针分别指向当前的数组位置,不断切分直到指针指向一个位置,再返回,然后进行合并,由于递归的操作,可以保证每次合并时只会有两个排序好的链表。
所以这辆的关键就是要搞清楚怎么递归去合并两个链表,以及如何递归合并一个大的数组
如下是代码:
1 package algorithm; 2 3 public class RecursiveSort { 4 5 public ListNode mergeKLists(ListNode[] lists) { 6 if(lists.length < 1){ 7 return null; 8 } 9 10 return merge(lists,0,lists.length-1); 11 } 12 13 private ListNode merge(ListNode[] lists,int left,int right){ 14 15 if(left >= right){ 16 return lists[left]; 17 } 18 int center = (left+right)/2; 19 20 ListNode leftNode = merge(lists,left,center); 21 ListNode rightNode = merge(lists,center+1,right); 22 23 ListNode temp = new ListNode(); 24 temp = mergeTwoListNode2(leftNode,rightNode,temp); 25 26 return temp; 27 28 } 29 30 /** 31 * 递归合并 32 * @param l1 33 * @param l2 34 * @param temp 35 * @return 36 */ 37 private ListNode mergeTwoListNode2(ListNode l1,ListNode l2,ListNode temp){ 38 if(l1 == null || l2 == null){ 39 if(l1 == null && l2 == null){ 40 return l1; //边界情况返回哪个都是可以的 41 }else { 42 temp = l1 == null ? l2 : l1; 43 } 44 45 return temp; 46 } 47 48 if(l1.val > l2.val){ 49 temp = l2; 50 temp.next = mergeTwoListNode2(l1,l2.next,temp.next); 51 }else { 52 temp = l1; 53 54 temp.next = mergeTwoListNode2(l1.next,l2,temp.next); 55 } 56 57 return temp; 58 59 } 60 61 }
最后说实话,对于递归我还是没有搞明白,这道题也算是稀里糊涂的就完成了,但是个人认为比较重要的一点是先做好简单的,也就是先把两个链表的合并解决了,那剩下多个链表的合并就可以转变为多次 两个链表的合并这一步骤
原文地址:https://www.cnblogs.com/Kaithy-Rookie/p/11311360.html
- 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 数组属性和方法