• leetcodeTop100(32) 合并链表数组


    给你一个链表数组,每个链表都已经按升序排列。
    
    请你将所有链表合并到一个升序链表中,返回合并后的链表。
    
    示例 1:
    
    输入:lists = [[1,4,5],[1,3,4],[2,6]]
    输出:[1,1,2,3,4,4,5,6]
    1. package Top31_40;
    2. import Util.ListNode;
    3. import java.util.ArrayList;
    4. import java.util.List;
    5. // 合并 K 个升序链表
    6. /*
    7. 给你一个链表数组,每个链表都已经按升序排列。
    8. 请你将所有链表合并到一个升序链表中,返回合并后的链表。
    9. 示例 1
    10. 输入:lists = [[1,4,5],[1,3,4],[2,6]]
    11. 输出:[1,1,2,3,4,4,5,6]
    12. */
    13. public class Top32 {
    14. //方法一 将链表数组转化数据都加入到一个Integer的Arraylist 排序之后,在创建一个链表返回 时间复杂度可空间复杂度都是O(mn)
    15. public static ListNode mergeKLists(ListNode[] lists) {
    16. if(lists.length == 0){
    17. return null;
    18. }
    19. List<ListNode> allDataList = new ArrayList<>();
    20. for(ListNode node:lists){
    21. while (node!=null){
    22. allDataList.add(node);
    23. node = node.next;
    24. }
    25. }
    26. allDataList.sort((s1,s2)->(s1.val-s2.val));
    27. if(allDataList.size()==0){
    28. return null;
    29. }
    30. ListNode res = new ListNode(0);
    31. ListNode node = allDataList.get(0);
    32. for(int i = 0;i<allDataList.size();i++){
    33. node = allDataList.get(i);
    34. if(i ==0){
    35. res.next = node;
    36. }
    37. if(i<=allDataList.size()-2){
    38. node.next=allDataList.get(i+1);
    39. }
    40. if(i==allDataList.size()-1){
    41. node.next = null;
    42. }
    43. }
    44. return res.next;
    45. }
    46. // 方法二,分治法,之前有做个两个升序链表的合并,这样就另外用排序算法中的分治法来处理数组中的链表
    47. //分治法合并链表数组
    48. public ListNode divideMergeKLists(ListNode[] lists) {
    49. if (lists == null || lists.length == 0) return null;
    50. return merge(lists, 0, lists.length - 1);
    51. }
    52. private ListNode merge(ListNode[] lists, int left, int right) {
    53. if (left == right) return lists[left];
    54. int mid = left + (right - left) / 2;
    55. ListNode l1 = merge(lists, left, mid);
    56. ListNode l2 = merge(lists, mid + 1, right);
    57. return mergeTwoLists(l1, l2);
    58. }
    59. // 合并两个链表
    60. private ListNode mergeTwoLists(ListNode l1, ListNode l2) {
    61. if (l1 == null) return l2;
    62. if (l2 == null) return l1;
    63. if (l1.val < l2.val) {
    64. l1.next = mergeTwoLists(l1.next, l2);
    65. return l1;
    66. } else {
    67. l2.next = mergeTwoLists(l1,l2.next);
    68. return l2;
    69. }
    70. }
    71. public static void main(String[] args) {
    72. int[][] nums = {{1,4,5},{1,3,4},{2,6}};
    73. ListNode[] lists = new ListNode[nums.length];
    74. for(int i =0;i<nums.length;i++){
    75. ListNode node = ListNode.setNodes(0,nums[i]);
    76. lists[i] = node;
    77. }
    78. ListNode res = mergeKLists(lists);
    79. ListNode.printListData(res);
    80. }
    81. }

    harryptter / LeetcodeTop100 · GitCode

  • 相关阅读:
    蓝湖的安装及使用
    【JSON2WEB】11 基于 Amis 角色功能权限设置页面
    合同矩阵充要条件
    你还弄不清xxxForCausalLM和xxxForConditionalGeneration吗?
    如何寻找Springboot自动装配的实现
    【LeetCode题目详解】第九章 动态规划part08 139.单词拆分 (day46补)
    java基于springboot+vue的疫情网课管理系统 elementui
    MATLAB【函数和图像】
    【LMKD】十 lmkd进程查杀配置
    Spring | 基于SpringBoot的多数据源实战 - 使用seata实现多数据源的全局事务管理
  • 原文地址:https://blog.csdn.net/harryptter/article/details/133377192