合并K个排序链表
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入: [ 1->4->5, 1->3->4, 2->6 ] 输出: 1->1->2->3->4->4->5->6
解法:
采用两两个合并的的方法
1.设置一个两个列表合并的函数
2.再用二路归并进行函数调用
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public ListNode mergeKLists(ListNode[] lists) { //有K个链表 int k = lists.length; if(k==0) return null; ListNode result = lists[0]; while (k > 1) { for (int i = 0; i < k/2; i++) lists[i] = mergeTwoLists(lists[i], lists[i + (k + 1)/2]); k = (k + 1) / 2; } return lists[0]; } public ListNode mergeTwoLists(ListNode l1, ListNode l2) { ListNode p1,p2; p1 = l1; p2=l2; ListNode head = new ListNode(0); ListNode r = head; if(l1==null) return l2; if(l2==null) return l1; //合并 while(p1!=null && p2!=null){ if(p1.val <= p2.val){ r.next = p1; r = p1; p1 = p1.next; }else{ r.next = p2; r = p2; p2 = p2.next; } } if(p1==null){ r.next = p2; r = p2; } if(p2==null){ r.next = p1; r = p1; } return head.next; } }