• 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

  • 相关阅读:
    Vue中的数据监视
    Docker——开源的应用容器的引擎
    Adversarial attacks and defenses on AI in medical imaging informatics: A survey
    使用telegram机器人发送通知
    连接Google PaLM API, 503错误解决
    webpack使用 三 优化环境配置
    嵌入式网络接口之MAC芯片与PHY芯片
    【图像去噪】基于matlab非线性扩散PM算法图像去噪【含Matlab源码 2130期】
    Java生态系统的进化:从JDK 1.0到今天
    6.PHP函数、$GET和$POST变量
  • 原文地址:https://blog.csdn.net/harryptter/article/details/133377192