Leetcode 23 Merge k Sorted Lists

Merge k Sorted Lists

Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity.

Solution1

  • 将链表利用二分法两两进行合并。代码如下:
public class Solution {
    public ListNode mergeKLists(ListNode[] lists) {
        if(lists.length==0) return null;
        return help1(lists,0,lists.length-1);
    }

    public ListNode help1(ListNode[] lists, int start, int end){//用二分法比用for循环还是简单快速一些
        if(start>=end) return lists[start];
        int mid = (start+end)/2;
        ListNode l1 = help1(lists,start,mid);
        ListNode l2 = help1(lists,mid+1,end);
        return merge(l1,l2);
    }

    public ListNode merge(ListNode l1, ListNode l2){//将两个链表进行合并
        ListNode dummy = new ListNode(-1);
        dummy.next = l1;
        l1 = dummy;
        while(l1.next!=null&&l2!=null){
            if(l1.next.val>l2.val){
                ListNode temp = l1.next;
                l1.next = l2;
                l2 = l2.next;
                l1.next.next = temp;
            }
            l1 = l1.next;//不管是l1大还是l2大,l1最终都要往下走一步。
        }
        if(l2!=null) l1.next = l2;
        return dummy.next;        
    }
}

Solution2

- 利用最小堆来实现。即先将链表的所有头结点放入一个最小堆,每次从最小堆取出一个最小值的节点来,并将该节点后面的节点存入最小堆。如此往复。代码如下:
import java.util.Comparator;
import java.util.PriorityQueue;
public class Solution {
    public ListNode mergeKLists(ListNode[] lists) {
        PriorityQueue<ListNode> pq = new PriorityQueue<ListNode>(1,new Comparator<ListNode>(){
            public int compare(ListNode l1,ListNode l2){
                return l1.val-l2.val;
            }
        });//利用优先队列实现了一个最小堆
        for(ListNode node:lists) if(node!=null) pq.offer(node);//将所有头结点存入最小堆中
        ListNode head = pq.poll();//先取出头结点,当然这里也可以用虚节点从而更方便
        ListNode node = head;
        while(node!=null){
            ListNode temp = node.next;
            if(temp!=null) pq.offer(temp);
            node.next = pq.poll();
            node = node.next;
            if(pq.size()==0) break;
        }
        return head; 
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值