码迷,mamicode.com
首页 > 编程语言 > 详细

合并K个排序链表

时间:2019-01-23 15:45:07      阅读:249      评论:0      收藏:0      [点我收藏+]

标签:length   head   方法   合并   for   null   归并   lin   result   

合并 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。

示例:

输入:
[
  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;
    }
}

 

合并K个排序链表

标签:length   head   方法   合并   for   null   归并   lin   result   

原文地址:https://www.cnblogs.com/yejiang/p/10308877.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!