题目:合并\ k k 个已排序的链表并将其作为一个已排序的链表返回。分析并描述其复杂度。
解答:
思路: 已经解决了两个排序链表的问题,则k个链表的排序也进行依次遍历即可解决;因为两个链表合并的时间复杂度是O(n),空间复杂度是O(1);k个链表是外加一次循环,所以时间复杂度为O(n*m)(n为lists数组的长度,m为数组中链表的长度),空间复杂度为O(1)
import java.util.*;
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null; }
* }
*/
public class Solution {
public ListNode mergeKLists(ArrayList<ListNode> lists) {
//思路: 已经解决了两个排序链表的问题,则k个链表的排序也进行依次遍历即可解决
//因为两个链表合并的时间复杂度是O(n),空间复杂度是O(1);k个链表是外加一次循环,所以时间复杂度为O(n*m)(n为lists数组的长度,m为数组中链表的长度),空间复杂度为O(1)
ListNode result = null;
for(ListNode list:lists){
result = mergeTwoList(result,list);
}
return result;
}
public static ListNode mergeTwoList(ListNode l1,ListNode l2){
if(l1 == null || l2 == null){
return l1 == null ? l2 : l1;
}
ListNode head = new ListNode(0);
ListNode temp = head;
while(l1 != null && l2 != null){
if(l1.val <= l2.val){
temp.next = l1;
temp = temp.next;
l1 = l1.next;
}else{
temp.next = l2;
temp = temp.next;
l2 = l2.next;
}
}
if(l1 == null){
temp.next = l2;
}else if(l2 == null){
temp.next = l1;
}
return head.next;
}
}