23. 合并K个升序链表 + 归并排序
23. 合并K个升序链表
23. 合并K个升序链表
题目描述
题解分析
- 题目需要考察的就是两个有序链表的合并, 这题和另一题类似:https://www.cnblogs.com/GarrettWale/p/14514211.html
- 对于多个链表的合并,可以借鉴归并排序的思想,递归合并多个小的链表。
- 需要注意的一个点就是递归的出口,当l==r时,注意不能直接返回null,需要返回一个链表,否则会缺少元素。
代码实现
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode mergeKLists(ListNode[] lists) {
int n = lists.length;
return merge(lists, 0, n-1);
}
public ListNode merge(ListNode[] lists, int l, int r){
if(l == r)//注意这里和普通归并排序不同,这里当l==r时需要返回链表,而不是简单的null
return lists[l];
if(l > r)
return null;
int mid = (l + r) >> 1;
ListNode list1 = merge(lists, l, mid);
ListNode list2 = merge(lists, mid+1, r);
return mergeTwo(list1, list2);
}
public ListNode mergeTwo(ListNode list1, ListNode list2){
ListNode dumyHead = new ListNode(0);
ListNode head = dumyHead;
while(list1 != null && list2 != null){
if(list1.val <= list2.val){
head.next = list1;
list1 = list1.next;
}else{
head.next = list2;
list2 = list2.next;
}
head = head.next;
}
head.next = (list1 == null) ? list2 : list1;
return dumyHead.next;
}
}
Either Excellent or Rusty