一、题目
给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
示例 1:
输入: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
示例 2:
输入:lists = []
输出:[]
示例 3:
输入:lists = [[]]
输出:[]
提示:
k == lists.length
0 <= k <= 10^4
0 <= lists[i].length <= 500
-10^4 <= lists[i][j] <= 10^4
lists[i]
按 升序 排列lists[i].length
的总和不超过10^4
二、题解
按顺序进行合并,使用一个result,第几轮循环就把第几个链表合并进去
- 由于每添加一个链表都需要调用一次合并部分,因此此处代码独立
- 如果有一个是空的链表,直接返回另一个
- 两个都不空,逐一添加,比较两个链表当前结点的值的大小,让对应的tail的next指针指向小的
- 更新结果的尾结点
- 当两个不一样长时,有一个链表已经空了,则让结果的链表的tail.next 直接指向相应的剩余链表的头结点
- 返回结果链表的头结点
三、代码
public ListNode mergeKLists(ListNode[] lists) {
ListNode result = null;
for (int i = 0; i < lists.length; ++i) {
result = mergeFunc(result, lists[i]);
}
return result;
}
public ListNode mergeFunc(ListNode a, ListNode b){
if(a == null || b == null){
return a == null ? b : a;
}
//头尾指针
ListNode head = new ListNode(0);
ListNode tail = head, m = a, n = b; //用作当前结点
//逐一合并
//都不空
while( m != null && n != null){
if(m.val < n.val){
tail.next = m;
m = m.next;
}else{
tail.next = n;
n = n.next;
}
tail = tail.next;
}
// 有一个空
tail.next = (m != null ? m : n);
return head.next;
}
四、结果
五、说明
本文章仅用于记录个人做题记录
由于本人是个小菜鸡(实锤),题目解法并非最优,且解题过程中参考(抄袭)各大佬解题方法,望见谅。