欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode Merge k Sorted Lists 解决报告

发布时间:2024/4/17 编程问答 49 豆豆
生活随笔 收集整理的这篇文章主要介绍了 LeetCode Merge k Sorted Lists 解决报告 小编觉得挺不错的,现在分享给大家,帮大家做个参考.
https://oj.leetcode.com/problems/merge-k-sorted-lists/
归并K已经整理阵列,和分析算法的复杂。



解决报告:无论是不考虑优化,最简单的实现是要重新走路List<ListNode>。对当中每一个链表同当前链表做一遍类似于归并排序最后一步的merge操作。
算法复杂度是O(KN)

public class Solution {ListNode mergeTwoLists(ListNode list1, ListNode list2) {ListNode head = new ListNode(-1);ListNode current = head;while(list1!=null&&list2!=null) {if(list1.val<list2.val) {current.next = list1;list1 = list1.next;} else {current.next = list2;list2 = list2.next;}current = current.next;}if(list1!=null) {current.next = list1;} else {current.next = list2;}return head.next;}public ListNode mergeKLists(List<ListNode> lists) {if(lists==null||lists.size()==0) {return null;}ListNode head = lists.get(0);for(int i=1;i<lists.size();i++) {head = mergeTwoLists(head, lists.get(i));}return head;} }
上面的方法TLE了,上网查了一下注意到通过使用归并排序算法可将链表排序的时间复杂度缩减到的O(NlgN)。详细的计算公式就是:



所以借鉴归并排序的方法,自顶向下,先递归的对链表的前半部分和后半部分进行归并排序,最后再merge。
下面代码顺利AC了,时间复杂度为:O(NlogK)

public class Solution {ListNode merge2Lists(ListNode list1, ListNode list2) {ListNode head = new ListNode(-1);ListNode current = head;while(list1!=null&&list2!=null) {if(list1.val<list2.val) {current.next = list1;list1 = list1.next;} else {current.next = list2;list2 = list2.next;}current = current.next;}if(list1!=null) {current.next = list1;} else {current.next = list2;}return head.next;}public ListNode mergeKLists(List<ListNode> lists) {if(lists==null||lists.size()==0) {return null;}if(lists.size()==1) {return lists.get(0);}int length = lists.size() ;int mid = (length - 1)/2 ;ListNode l1 = mergeKLists(lists.subList(0,mid + 1)) ;ListNode l2 = mergeKLists(lists.subList(mid + 1,length)) ;return merge2Lists(l1,l2) ;} }




版权声明:本文博主原创文章,博客,未经同意不得转载。

总结

以上是生活随笔为你收集整理的LeetCode Merge k Sorted Lists 解决报告的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。