leetCode 23. Merge k Sorted Lists (合并k个排序链表) 解题思路和方法
来源:互联网 发布:xalhar哈萨克音乐软件 编辑:程序博客网 时间:2024/05/01 08:17
Merge k Sorted Lists
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.
思路:此题是由合并两个排序链表演化而来,刚开始,想法比较简单,像求最大公共前缀一样,逐一求解;但是最后超时,所以马上意识到出题方是为了使用归并和分治的方法,故重新写了代码。
代码一(超时未过):
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */public class Solution { public ListNode mergeKLists(ListNode[] lists) { int len = lists.length; if(len == 0){ return null; } if(len == 1){ return lists[0]; } ListNode head = lists[0]; for(int i = 0; i < len; i++){ head = mergeTwoLists(head,lists[i]); } return head; } public ListNode mergeTwoLists(ListNode l1, ListNode l2) { if(l1 == null || l2 == null) return l1 == null ? l2:l1; ListNode head = new ListNode(0);//定义一个头结点 ListNode p = head; ListNode temp = null; while(l1 != null && l2 != null){ if(l1.val > l2.val){ temp = l2;//用一个temp保存现在的l1或l2 l2 = l2.next;//l1或l2指针后移1位 }else{ temp = l1; l1 = l1.next; }//交换数据 p.next = temp; p = p.next; }//temp取不为空的一个(也可能全为空) temp = l1 == null ?l2:l1; p.next = temp;//将剩余的全部链接即可(上面的方法太啰嗦了) return head.next; }}代码二(通过):
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */public class Solution { public ListNode mergeKLists(ListNode[] lists) { int len = lists.length; //长度分别为<=1时的情况 if(len == 0){ return null; } if(len == 1){ return lists[0]; } ListNode[] ln = lists; while(len > 2){//大于等于2分而治之 ln = merge(ln);//调用函数 len = ln.length;//更新len }//最后两个归并 ln[0] = mergeTwoLists(ln[0],ln[1]); return ln[0]; } //对lists两两归并 public ListNode[] merge(ListNode[] lists){ int len = lists.length; //两两归并 ListNode[] arr; //长度为偶数 if((len & 1) == 0){ arr = new ListNode[len/2]; }else{//长度为奇数 arr = new ListNode[len/2 + 1]; arr[len/2] = lists[len - 1];//最后1位不参与归并 }//两两归并实现;i < len-1;不能是i<len;不然报错 for(int i = 0; i < len - 1; i = i+2){ ListNode a = lists[i]; ListNode b = lists[i+1]; arr[i/2] = mergeTwoLists(lists[i],lists[i+1]);//调用两两归并方法 } return arr; } public ListNode mergeTwoLists(ListNode l1, ListNode l2) { if(l1 == null || l2 == null) return l1 == null ? l2:l1; ListNode head = new ListNode(0);//定义一个头结点 ListNode p = head; ListNode temp = null; while(l1 != null && l2 != null){ if(l1.val > l2.val){ temp = l2;//用一个temp保存现在的l1或l2 l2 = l2.next;//l1或l2指针后移1位 }else{ temp = l1; l1 = l1.next; }//交换数据 p.next = temp; p = p.next; }//temp取不为空的一个(也可能全为空) temp = l1 == null ?l2:l1; p.next = temp;//将剩余的全部链接即可(上面的方法太啰嗦了) return head.next; }}
0 0
- leetCode 23. Merge k Sorted Lists (合并k个排序链表) 解题思路和方法
- Leetcode 23. Merge k Sorted Lists合并k个排序链表
- leetcode 23. Merge k Sorted Lists 合并k个排序链表 优先级队列
- leetCode 21.Merge Two Sorted Lists (合并排序链表) 解题思路和方法
- leetcode解题之23.Merge k Sorted Lists Java版本(合并k个有序的链表)
- LeetCode 23 Merge k Sorted Lists(合并K个已排序链表)
- LeetCodet题解--23. Merge k Sorted Lists(合并K个已排序的链表)
- 合并k个有序链表 Merge k Sorted Lists
- Leetcode #23 Merge k Sorted Lists 合并K个有序列表 解题报告
- Merge k Sorted Lists 合并k个有序链表@LeetCode
- LeetCode OJ 之 Merge k Sorted Lists(合并k个有序链表)
- 合并K个有序链表(LeetCode:Merge k Sorted Lists)
- lintcode merge-k-sorted-lists 合并k个排序链表
- 104.Merge k Sorted Lists-合并k个排序链表(中等题)
- [leetcode] 【排序】 23. Merge k Sorted Lists
- [leetcode-排序]--23. Merge k Sorted Lists
- LeetCode 23. Merge k Sorted Lists(K路合并)
- 23. Merge k Sorted Lists 合并K个有序链表
- dynamica programming coins in line
- 强大的JS日期/时间选择控件(精确到天、小时、分钟都可以)
- [分享]关于mac的保修时间计算政策,附送延长保修时间秘诀
- 哈夫曼树
- 配置apache 支持 php
- leetCode 23. Merge k Sorted Lists (合并k个排序链表) 解题思路和方法
- 2015070610 - 看到很多所谓的大牛
- ubuntu shell脚本开机自动运行的方法
- 集合(1) list hash
- poj 2151 Check the difficulty of problems 概率dp
- asp.net 学习之路之gridView控件之修改数据
- css3动画2种区分
- Redhat Linux RPM包安装软件及其管理
- 题目1195:最长&最短文本