合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入: [ 1->4->5, 1->3->4, 2->6 ] 输出: 1->1->2->3->4->4->5->6
思路:归并排序+双链表排序。将问题分解为子问题,两两归并。
代码:
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public ListNode mergeKLists(ListNode[] lists) { int n=lists.length; if(n==0)return null; while (n > 1) { //两两归并有序链表,单个链表不处理 int k=(n + 1)/2; //两两归并之后的链表个数 for (int i=0; i<n/2; i++) { lists[i]=merge(lists[i],lists[i+k]);//比如6个链表,0-3 1-4 2-5 } n = k; } return lists[0]; } //合并两个有序链表,使用的递归 public ListNode merge(ListNode l1,ListNode l2){ ListNode head=null; if(l1==null)return l2; if(l2==null)return l1; if(l1.val>l2.val){ head=l2; head.next=merge(l1,l2.next); }else { head=l1; head.next=merge(l1.next,l2); } return head; } }