Leetcode初学——合并K个排序链表

题目:

这道题和之前的一道合并两个排序链表有异曲同工之处,本来我想用迭代法写的,可惜才疏学浅,最终还是使用了暴力法

class Solution {
    public ListNode mergeKLists(ListNode[] lists) {
        int i=0;
        int temp=0;
        // 用于计数list中有多少个null元素
        int nullcount=0;
        List<ListNode> list=Arrays.asList(lists);
        ListNode res=new ListNode(0);
        ListNode tempRes=res;
        while(list.size()!=nullcount){
            temp=0;
            int tempVal=Integer.MAX_VALUE;
            i=0;
            while(i<list.size()){
                if(list.get(i)==null) {
                    i++;
                    continue;
                }
                if(tempVal>=list.get(i).val){
                    tempVal=list.get(i).val;
                    temp=i;
                }
                i++;
            }
            if(list.get(temp)==null) break;
            tempRes.next=list.get(temp);
            tempRes=tempRes.next;
            list.set(temp,list.get(temp).next);
            if(list.get(temp)==null) nullcount++;
        }
        return res.next;
    }
}

运行结果自然也是不太好:

不过我在题解中看到了一个非常有意思的算法——分而治之

将一个数组,分成多个,两两进行重组

class Solution {
   public ListNode mergeKLists(ListNode[] lists) {
        if (lists == null || lists.length == 0) return null;
        return merge(lists, 0, lists.length - 1);
    }

    private ListNode merge(ListNode[] lists, int left, int right) {
        if (left == right) return lists[left];
        int mid = left + (right - left) / 2;
        ListNode l1 = merge(lists, left, mid);
        ListNode l2 = merge(lists, mid + 1, right);
        return mergeTwoLists(l1, l2);
    }

    private ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        if (l1 == null) return l2;
        if (l2 == null) return l1;
        if (l1.val < l2.val) {
            l1.next = mergeTwoLists(l1.next, l2);
            return l1;
        } else {
            l2.next = mergeTwoLists(l1,l2.next);
            return l2;
        }
    }
}

作者:powcai
链接:https://leetcode-cn.com/problems/merge-k-sorted-lists/solution/leetcode-23-he-bing-kge-pai-xu-lian-biao-by-powcai/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

mergeKLists方法和mergeTwoLists方法都很清楚明了

这里就对上方的merge方法进行画图分析:

第一次进去的数据是这样的

l1:

所以需要进一步迭代

求出l1中的‘l1’=A,‘l2'=B

l1=mergeTwoLists(A,B)

l2:

l2也要进一步迭代

求出l2中的‘l1’=C,‘l2’=D

l2=mergeTwoLists(C,D)

所以最终返回的结果就是  mergeTwoLists(l1,l2);

运行效率远超暴力法

如果大家有什么更好的方法或建议,可以在评论留言哦

发布了25 篇原创文章 · 获赞 3 · 访问量 432

猜你喜欢

转载自blog.csdn.net/qq_39377543/article/details/104079854
今日推荐