zoukankan      html  css  js  c++  java
  • leetcode23 多个拍好序的链表进行归并排序 (java版本)

    题目:

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

    思路1:

        依次归并排序,首先归并前两个,然后归并完成的链表依次和剩下的链表进行归并排序

        时间复杂度为O(m*n)

    代码:

       

    public static ListNode mergeKLists1(ListNode[] lists){
    int len = lists.length;
    if(len == 0){
    return null;
    }else{
    if(len == 1){
    return lists[0];
    }else{
    ListNode headl = new ListNode(-1);
    ListNode head1 = lists[0], head2 = lists[1];
    for(int i=0; i < len-1; i++){
    if(head1 == null){
    headl.next = head2;
    }else{
    if(head2 == null){
    headl.next = head1;
    }else{
    //测量head1的链表长度
    int len1 = 0;
    ListNode ptr = head1;
    while(ptr != null){
    len1++;
    ptr = ptr.next;
    }

    //测量head2的长度
    int len2 = 0;
    ptr = head2;
    while(ptr != null){
    len2++;
    ptr = ptr.next;
    }

    ptr = headl;
    ListNode ptr1 = head1, ptr2 = head2;
    for(int j=0; j< len1+len2; j++){
    if(ptr1 !=null && ptr2 != null){
    if(ptr1.val <= ptr2.val){
    ptr.next = ptr1;
    ptr1 = ptr1.next;
    ptr = ptr.next;
    }else{
    ptr.next = ptr2;
    ptr2 = ptr2.next;
    ptr = ptr.next;
    }
    }else{
    if(ptr1 == null){
    ptr.next = ptr2;
    ptr2 = ptr2.next;
    ptr = ptr.next;
    }else{
    ptr.next = ptr1;
    ptr1 = ptr1.next;
    ptr = ptr.next;
    }
    }
    }
    head1 = headl.next;
    if(i+2 <= len-1){
    head2 = lists[i+2];
    }else{
    break;
    }
    }//else(head1!=null && head2 != null)
    }
    } //for(int i=0; i < len-1; i++)
    return headl.next;
    }
    }
    }

    思路2: 

       分治法

       两两归并,递归调用即可。

       因为每个链表都已经排序完成了,因此可以把链表数组看成一个待归并排序的数组,对之采用归并排序即可。

       时间复杂度为O(n)

       AC通过

    代码:

    public static ListNode mergeKLists(ListNode[] lists){
    return mergeKLists(lists, 0, lists.length-1);
    }


    //分治法果然有效
    public static ListNode mergeKLists(ListNode[] lists, int start, int end){
    if(start == end){
    return lists[start];
    }
    if(start > end){
    return null;
    }
    int mid = (start + end)/2;
    ListNode head1 = mergeKLists(lists, start, mid);
    ListNode head2 = mergeKLists(lists, mid+1, end);
    ListNode headl = new ListNode(-1);
    ListNode ptr = headl;
    while(head1 != null && head2 != null){
    if(head1.val <= head2.val){
    ptr.next = head1;
    head1 = head1.next;
    ptr = ptr.next;
    }else{
    ptr.next = head2;
    head2 = head2.next;
    ptr = ptr.next;
    }
    }

    while(head1 != null){
    ptr.next = head1;
    head1 = head1.next;
    ptr = ptr.next;
    }

    while(head2 != null){
    ptr.next = head2;
    head2 = head2.next;
    ptr = ptr.next;
    }

    return headl.next;
    }

  • 相关阅读:
    ASP.NET AJAX入门系列(5):使用UpdatePanel控件(二)
    ASPxGridView之MasterDetail
    ASPxGridView子项动态邦定
    锐浪报表不能访问grf文件
    如何把string解析为int?[C#]
    今天你多态了吗?
    接口继承的声明问题 [C#, BCL]
    如何判断字符串是否为空串?[C#]
    尝鲜微软新桌面主题——Energy Blue
    JSON数据之使用Fastjson进行解析(一)
  • 原文地址:https://www.cnblogs.com/bywallance/p/5543790.html
Copyright © 2011-2022 走看看