zoukankan      html  css  js  c++  java
  • leetcode刷题3

    今天刷的题是LeetCode第23题。合并k个有序链表。

    该题,我现在采用的是暴力法解决。后续将添加其他解决方法。所谓的暴力法求解指的是:将链表中所有数据保存到数组中,然后统一排序,再重新生成新的链表。代码如下:

    package DynamicProgramming;
    
    import LeetCodePart1.ListNode;
    import com.sun.xml.internal.ws.api.model.wsdl.WSDLOutput;
    import org.w3c.dom.ls.LSOutput;
    
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.LinkedList;
    import java.util.List;
    
    /**
     * @date 2019/8/7
     * @description 合并K个有序链表
     */
    public class MergeKLink {
        public static ListNode merge1(ListNode[] lists){
            /**
            * @param lists
             * @Description 这是合并k个有序链表的第一个方法。暴力法
             * 暴力法的求解思路是:先将所有的链表中的数据保存到一个数组中,然后排序,再生成新的链表
             */
            int size=lists.length;
            List<Integer> list=new ArrayList<>();
            for (int i = 0; i <size ; i++) {
                while (lists[i]!=null){
                    list.add(lists[i].getVal());
                    lists[i]=lists[i].getNext();
                }
            }
            Collections.sort(list);
            ListNode result=new ListNode(list.get(0));
            ListNode point =result;
            for (int i = 0; i <list.size() ; i++) {
                point.setNext(new ListNode(list.get(i)));
                point=point.getNext();
            }
            return result.getNext();
        }
    }

     当然也可以挨个挨个比较,比较每个链表的头结点,找出最小的,然后放到新的链表中。代码如下:

    public static ListNode merge2(ListNode[] lists){
            /**
            * @param lists
             * @Description 挨个比较
             */
            ListNode result=new ListNode(0);
            ListNode point=result;
            boolean flag=MergeKLink.compare(lists);
            while (flag){
                int minNum = 0;
                int minIndex=0;
                for (int i = 0; i <lists.length ; i++) {
                    if (lists[i]!=null){
                        minNum=lists[i].getVal();
                        minIndex=i;
                        break;
                    }
                }
                for (int i = 0; i <lists.length ; i++) {
                    if (lists[i]!=null && lists[i].getVal()<minNum){
                            minNum=lists[i].getVal();
                            minIndex=i;
                        }
                }
                lists[minIndex]=lists[minIndex].getNext();
                flag=MergeKLink.compare(lists);
                point.setNext(new ListNode(minNum));
                point=point.getNext();
            }
            return result.getNext();
        }
        public static boolean compare(ListNode[] lists){
            boolean flag=false;
            for (int i = 0; i <lists.length ; i++) {
                if (lists[i]!=null){
                    flag=true;
                }
            }
            return flag;
        }
  • 相关阅读:
    Java 常见异常种类
    Spring3.2+mybatis3.2+Struts2.3整合配置文件大全
    Java中的基本类型和引用类型变量的区别
    【git】Git 提示fatal: remote origin already exists 错误解决办法
    【Java集合】Java中集合(List,Set,Map)
    POJ3322-经典的游戏搜索问题
    程序人生[流程图]
    不使用中间变量交换两个数
    做人要低调,别把自己太当回事
    【转】嵌套子控件设计时支持
  • 原文地址:https://www.cnblogs.com/cquer-xjtuer-lys/p/11317736.html
Copyright © 2011-2022 走看看