zoukankan      html  css  js  c++  java
  • leetcode

    合并k个有序链表

     主要思想是分治和递归,首先用二分法将k个链表不断二分,直到细分到两个链表,然后将这两个有序链表合并,然后继续重复合并的过程,直到所有链表合并完成。可以理解成不停的拆分,拆分至合并两个有序链表的子问题。然后组装若干个子问题,直到所有子问题解决就得到原问题的解。

          

                    /*
            * 合并k个有序链表
             */
        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);
        }
        /*
         * 合并两个有序链表(递归)
         */
        public 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;
            }
        }

      合并两个有序链表有两种方式,递归和非递归,上面是递归的代码,下面是非递归的代码

        

              /*
         * 合并两个有序链表(迭代)
         */
        public ListNode mergeTwoLists2(ListNode l1, ListNode l2) {
            ListNode prehead = new ListNode(-1);
            ListNode prev = prehead;
            while(l1!=null && l2!=null){
                if(l1.val<=l2.val){
                    prev.next = l1;
                    l1 = l1.next;
                }else{
                    prev.next = l2;
                    l2 = l2.next;
                    prev = prev.next;
                }
            }
            prev.next = l1==null?l2:l1;
            return prehead.next;
        }
    View Code
  • 相关阅读:
    selenium屏蔽浏览器检测
    cookies字符串转化为字典
    python压缩图片大小
    python异步爬虫aiohttp
    python通过命令行接收参数
    hustoj实现远程判题的两种方案
    SqlLocalDB工具的一些有趣发现
    Chrome中编译安装vue-devtools插件
    用友政务表格技术应用开发实践:预算一体化产品核心功能搭建
    企业表格技术应用开发案例大赛圆满落幕!
  • 原文地址:https://www.cnblogs.com/chenbo820/p/11660377.html
Copyright © 2011-2022 走看看