7 合并两个有序列表
21. 合并两个有序链表 - 力扣(LeetCode)
方法1 优先级队列
之前做过合并k个有序列表,两个方法是一样的
class Solution {
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
//递归,dfs的作用是拼接除了该节点的两个链表,并且返回头结点
if(list1 == null) return list2;
if(list2 == null) return list1;
PriorityQueue<ListNode> queue = new PriorityQueue<>((a,b) -> a.val - b.val);
queue.offer(list1);
queue.offer(list2);
ListNode result = new ListNode(0);
ListNode head = result;
while(!queue.isEmpty()) {
result.next = queue.poll();
if(result.next.next != null){
queue.offer(result.next.next);
}
result = result.next;
}
return head.next;
}
}
方法二:递归
就是我们将每个子问题抽离出来,问题就是每次传入两个链表的头节点进行比大小,选出值较小的节点,值较小的那个节点
class Solution {
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
//递归,dfs的作用是拼接除了该节点的两个链表,并且返回头结点
if(list1 == null) return list2;
if(list2 == null) return list1;
if(list1.val < list2.val){
list1.next = mergeTwoLists(list1.next, list2);
return list1;
}else{
list2.next = mergeTwoLists(list1, list2.next);
return list2;
}
}
}