题目:
k 个已排序的链表并将其作为一个已排序的链表返回。分析并描述其复杂度。
太笨了太笨了,看到有序数列合并还想不到归并排序。
解法一是直接进行归并排序,使用循环进行k-1次归并,
解法二是使用优先队列,由于之前没有用过这种数据结构,因此这里尝试使用优先队列进行解决。
首先使用优先队列的话要重新调整compare方法,使其能够适应ListNode的值的比较。
使用优先队列不需要将所有链表的节点加入,只需要将链表的头节点加入到队列中,队列会根据节点值对队列元素进行排序,然后对队列进行遍历,使用带头节点的res链表来存储最终结果,使用tempRes来作为res的尾指针。在遍历的过程中,取队首元素,添加到res中,队尾指针后移,然后判断当前拿到的这个队首元素还有没有后继节点,有的话添加到队列中,继续执行,直到队列为空。
自己还是缺少利用已知的数结构去解决问题的能力啊。
完整代码如下:
public ListNode mergeKLists(ArrayList<ListNode> lists) {
if(lists==null||lists.size()==0) {
return null;
}
PriorityQueue<ListNode> queue = new PriorityQueue<>(lists.size(),new Comparator<ListNode>() {
@Override
public int compare(ListNode o1, ListNode o2) {
// TODO Auto-generated method stub
if(o1.val>o2.val) {
return 1;
}else if(o1==o2) {
return 0;
}else {
return -1;
}
}
});
for(ListNode temp:lists) {
if(temp!=null) {
queue.add(temp);
}
}
ListNode res = new ListNode(0);
ListNode tempRes = res;
while (!queue.isEmpty()) {
tempRes.next = queue.poll();;
tempRes = tempRes.next;
if(tempRes.next!=null) {
queue.add(tempRes.next);
}
}
return res.next;
}