- 合并两个有序链表
将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
1.递推法
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if(l1 == null) return l2;//作为递推边界
if(l2 == null) return l1;
if(l1.val < l2.val){
l1.next = mergeTwoLists(l1.next, l2);
return l1;
}else{
l2.next = mergeTwoLists(l1, l2.next);
return l2;
}
}
}
2.手动方法
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if(l1 == null) return l2;//作为递推边界
if(l2 == null) return l1;
ListNode node = new ListNode(-1);
ListNode p = node;
while(l1 != null && l2 != null){
if(l1.val < l2.val){
p.next = l1;
l1 = l1.next;
}else{
p.next= l2;
l2 = l2.next;
}
p = p.next;
}
if(l1 != null) p.next = l1;
if(l2 != null) p.next = l2;
return node.next;
}
}
L23
- 合并K个排序链表
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
1.通过小顶堆
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
if(lists == null || lists.length == 0) return null;
int len = lists.length;
PriorityQueue<ListNode> pq = new PriorityQueue<>(len, new Comparator<ListNode>(){
@Override
public int compare(ListNode l1, ListNode l2){
return l1.val - l2.val;
}
});
ListNode fake = new ListNode(-1);
//先把各自的头结点加入
for(ListNode list : lists){
//pq.add(list);这里也需要判断
if(list != null) pq.add(list);
}
ListNode p = fake;
while(!pq.isEmpty()){
ListNode now = pq.poll();
p.next = now;
//pq.add(now.next);这样会空指针异常
if(now.next != null) pq.add(now.next);
p = p.next;
}
return fake.next;
}
}
2.归并法,递推法
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
if(lists == null || lists.length == 0) return null;
int len = lists.length;
return merge(lists, 0, len - 1);
}
public ListNode merge(ListNode[] lists, int left, int right){
if(left > right) return null;
if(left == right) return lists[left];//单独列出来
int mid = left + (right - left)/2;
ListNode node1 = merge(lists, left, mid);
ListNode node2 = merge(lists, mid + 1, right);//相同的方法就是多了一个返回值
return mergeSort(node1, node2);//转换为二个链表合并
}
ListNode mergeSort(ListNode l1, ListNode l2){
if(l1 == null) return l2;
if(l2 == null) return l1;
if(l1.val < l2.val){
l1.next = mergeSort(l1.next, l2);
return l1;
}else{
l2.next = mergeSort(l1, l2.next);
return l2;
}
}
}