23.合并K个升序链表
思路1:
- 将每个链表中所有元素全都放到新链表中
- 用Collections工具给链表元素按大小排序
- 新建ListNode串起来即可
代码实现
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
if (lists.length == 0) return null;
int t;
for (t = 0; t < lists.length; t++) {
if (lists[t] != null) {
break;
}
}
if (t == lists.length) {
return null;
}
List<Integer> list = new LinkedList<Integer>();
for (int i = 0; i < lists.length; i++) {
while (lists[i] != null) {
list.add(lists[i].val);
lists[i] = lists[i].next;
}
}
Collections.sort(list, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1 - o2;
}
});
ListNode dummyHead = new ListNode(list.get(0));
ListNode dummyHead1 = new ListNode(list.get(0));
dummyHead1 = dummyHead;
for (int i = 1; i < list.size(); i++) {
dummyHead.next = new ListNode(list.get(i));
dummyHead = dummyHead.next;
}
return dummyHead1;
}
}
思路2:
- 将每个链表所有元素放进优先级队列中,并自定义比较器
- 创建ListNode串起来即可
- 注意当优先级队列取完为空时,添加head.next = null
代码实现
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
PriorityQueue<ListNode> queue = new PriorityQueue<ListNode>(new Comparator<ListNode>() {
@Override
public int compare(ListNode o1, ListNode o2) {
return o1.val - o2.val;
}
});
for (ListNode head : lists) {
while (head != null) {
queue.offer(head);
head = head.next;
}
}
ListNode dummy = new ListNode(0);
ListNode head = dummy;
while (!queue.isEmpty()) {
head.next = queue.poll();
head = head.next;
if (queue.isEmpty()) head.next = null;
}
return dummy.next;
}
}