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;
    }
原文地址:https://www.cnblogs.com/cquer-xjtuer-lys/p/11317736.html