题解 | #合并k个已排序的链表#
合并k个已排序的链表
http://www.nowcoder.com/practice/65cfde9e5b9b4cf2b6bafa5f3ef33fa6
归并排序,直接上代码
import java.util.*;
public class Solution {
public ListNode mergeKLists(ArrayList<ListNode> lists) {
//预处理,删除空的node
Iterator<ListNode> it = lists.iterator();
while(it.hasNext()){
ListNode node = it.next();
if(node==null){
it.remove();
}
}
//如果处理过后还是为空,则返回null
if(lists.size()==0){
return null;
}
//新链表的头
ListNode newHead = null;
newHead = findMin(lists);
//指针
ListNode cur =newHead;
while(lists.size()>0){//如果lists的大小大于0则循环进行
cur.next = findMin(lists);//指针的下一个为lists中的最小的node
cur = cur.next;//迭代指针
}
return newHead;
}
//找到lists中所有node头结点最小的node,同时将其移除
ListNode findMin(ArrayList<ListNode> lists){
ListNode min = null;
//最小值
int minVal = Integer.MAX_VALUE;
//下标
int idx = 0;
//遍历lists
for(int i=0;i<lists.size();i++){
ListNode root = lists.get(i);
if(root!=null){
if(root.val<minVal){
minVal = root.val;
min = root;
idx = i;
}
}
}
//先将其从lists中移除
lists.remove(idx);
//如果移除的node还有next则将next加入list的原位置,否则直接删除
if(min.next!=null){
lists.add(idx,min.next);
}
return min;
}
}
查看9道真题和解析