当前位置:   article > 正文

34、链表-合并K个升序链表

34、链表-合并K个升序链表

思路

1、直接全部放入集合中,然后排序,在进行构造节点返回

2、使用归并排序的方式,两两排序合并,最后合并大的。

3、第三中思路就比较巧妙了,可以使用小根堆,每次弹出堆顶,最小值,然后弹出后当前链表指向下一个节点,再压入堆中。如此反复。代码如下:

 

  1. public ListNode mergeKLists(ListNode[] lists) {
  2. if (lists==null||lists.length==0){
  3. return null;
  4. }
  5. //设置一个优先队列
  6. PriorityQueue<ListNode> heap = new PriorityQueue<>((o1, o2) -> o1.val - o2.val);
  7. //将所有节点放入 heap
  8. for (ListNode listNode:lists){
  9. if (listNode!=null){
  10. heap.add(listNode);
  11. }
  12. }
  13. if (heap.isEmpty()) {
  14. return null;
  15. }
  16. //弹出第一个节点
  17. ListNode head = heap.poll();
  18. //记录每次弹出的节点
  19. ListNode pre=head;
  20. //放入最小节点下一个节点
  21. if (pre.next!=null){
  22. heap.add(pre.next);
  23. }
  24. //循环比较
  25. while (!heap.isEmpty()){
  26. //弹出最小节点
  27. ListNode cur = heap.poll();
  28. //移动pre指针
  29. pre.next=cur;
  30. //在移动pre节点
  31. pre=cur;
  32. //最小节点下一个节点入队
  33. if (pre.next!=null){
  34. heap.add(pre.next);
  35. }
  36. }
  37. return head;
  38. }
  39. }

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

闽ICP备14008679号