当前位置:   article > 正文

LeetCode.23 Merge k Sorted Lists (对数组链表进行合并,归并排序 && 或者使用PriorityQueue实现)_priorityqueue list 排序归并

priorityqueue list 排序归并

题目:

Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.

分析:

  1. /**
  2. * Definition for singly-linked list.
  3. * public class ListNode {
  4. * int val;
  5. * ListNode next;
  6. * ListNode(int x) { val = x; }
  7. * }
  8. */
  9. class Solution {
  10. public ListNode mergeKLists(ListNode[] lists) {
  11. //对多个有序的链表进行合并
  12. //思路:类似归并排序,先合将队列拆成两部分,两部分继续拆分。之后合并两个小的队列几个
  13. if(lists==null||lists.length==0) return null;
  14. if(lists.length==1) return lists[0];
  15. return mergeKListsCore(lists,0,lists.length-1);
  16. }
  17. public ListNode mergeKListsCore(ListNode [] list,int start,int end){
  18. if(start<end){
  19. int mid=(start+end)/2;
  20. ListNode left=mergeKListsCore(list,start,mid);
  21. ListNode right=mergeKListsCore(list,mid+1,end);
  22. return mergeTwoList(left,right);
  23. }else{
  24. return list[start];
  25. }
  26. }
  27. public ListNode mergeTwoList(ListNode head1,ListNode head2){
  28. //两个链表合并
  29. ListNode A=head1;
  30. ListNode B=head2;
  31. ListNode temp=new ListNode(0);
  32. ListNode cur=temp;
  33. while(A!=null&&B!=null){
  34. if(A.val<B.val){
  35. cur.next=A;
  36. A=A.next;
  37. }else{
  38. cur.next=B;
  39. B=B.next;
  40. }
  41. cur=cur.next;
  42. }
  43. //防止还有剩下的
  44. while(A!=null){
  45. cur.next=A;
  46. cur=cur.next;
  47. A=A.next;
  48. }
  49. while(B!=null){
  50. cur.next=B;
  51. cur=cur.next;
  52. B=B.next;
  53. }
  54. return temp.next;
  55. }
  56. }

PriorityQueue实现:

  1. /**
  2. * Definition for singly-linked list.
  3. * public class ListNode {
  4. * int val;
  5. * ListNode next;
  6. * ListNode(int x) { val = x; }
  7. * }
  8. */
  9. class Solution {
  10. public ListNode mergeKLists(ListNode[] lists) {
  11. //使用优先队列PrirorityQueue实现,修改其中的对比内部类compare
  12. //保证每次插入都是按从小插入
  13. if(lists==null||lists.length==0) return null;
  14. // //JAVA之前,使用匿名内部类。记得初始化队列长度
  15. // PriorityQueue<ListNode> pq=new PriorityQueue<>(lists.length,new Comparator<ListNode>(){
  16. // @Override
  17. // public int compare(ListNode l1,ListNode l2){
  18. // //在添加元素的时候就进行规则排序。升序
  19. // if(l1.bal>l2.val){
  20. // return 1;
  21. // }else if(l1.val==l2.val){
  22. // return 0;
  23. // }else{
  24. // return -1;
  25. // }
  26. // }
  27. // });
  28. //Java8后使用lambda表达式更加高效、简捷
  29. PriorityQueue <ListNode> pq=new PriorityQueue<ListNode>(lists.length,(a,b)->a.val-b.val);
  30. ListNode res=new ListNode(0);
  31. ListNode cur=res;
  32. for(ListNode node:lists){
  33. //进行非空判断,防止里面存在空的子数组
  34. if(node!=null){
  35. //插入的时候已经进行了排序,最小的元素放在最前面
  36. pq.add(node);
  37. }
  38. }
  39. while(!pq.isEmpty()){
  40. cur.next=pq.poll();
  41. cur=cur.next;
  42. if(cur.next!=null){
  43. //将后面的元素继续插入队列
  44. pq.add(cur.next);
  45. }
  46. }
  47. return res.next;
  48. }
  49. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/277149
推荐阅读
相关标签
  

闽ICP备14008679号