今天刷的题是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; }