题目描述
给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
题目链接
测试用例
输入:lists = [[1,4,5],[1,3,4],[2,6]]
输出:[1,1,2,3,4,4,5,6]
解释:链表数组如下:
[
1->4->5,
1->3->4,
2->6
]
将它们合并到一个有序链表中得到。
1->1->2->3->4->4->5->6
输入:lists = []
输出:[]
输入:lists = [[]]
输出:[]
1. 顺序合并
思路
- 定义两个链表合并的函数
- 依次合并两个链表
- 先定义一个链表result为null
- 遍历ListNode数组,合并ListNode数组中遍历到的ListNode与result
代码
/**
* 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) {
//记录最终的结果,初始化为空
ListNode result = null;
for(ListNode list : lists){
//合并lists[i]与result
result = mergeTwoLists(result, list);
}
return result;
}
//合并两个list
public ListNode mergeTwoLists(ListNode list1, ListNode list2){
ListNode resultReturn = new ListNode(0);
ListNode result = resultReturn;
while(list1!=null || list2!=null){
int val1 = list1!=null ? list1.val : (int)Math.pow(10,4)+1;
int val2 = list2!=null ? list2.val : (int)Math.pow(10,4)+1;
if(val1 > val2){
result.next = list2;
result = result.next;
list2 = list2.next;
}else{
result.next = list1;
result = result.next;
list1 = list1.next;
}
}
return resultReturn.next;
}
}
2. 分治
3. 优先队列
改天补充