leetcode做题总结,题目Merge k Sorted Lists 2012/02/13

本文详细探讨了一种优化的链表合并方法,通过避免创建额外链表及合理利用现有数据结构来提高效率。同时,文章还提供了一种使用优先队列的替代解法,展示了算法优化的重要性与实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目是一个list里包含了好多有序链表头,对所有链表进行merge。我的做法是两两merge然后到第二级在两两merge直到只剩1个链表。我的程序虽然AC了但是还有许多可以优化的地方。1.对两条链表进行merge的时候我创建了第三条链表,实际上由于链表是由节点next联系在一起的,所以可以直接重新串在一起即可。不用创建新的链表。2.我把merge完的新链表头存在一个新链表里面,其实可以存在lists里面即可。


public ListNode merge(ListNode l1,ListNode l2){
        ListNode l3=new ListNode(0);
        ListNode head=l3;
        while(l1!=null&&l2!=null){
            if(l1.val<l2.val){
                l3.next=new ListNode(l1.val);
                l3=l3.next;
                l1=l1.next;
            }else{
                l3.next=new ListNode(l2.val);
                l3=l3.next;
                l2=l2.next;
            }
        }
        while(l1!=null){
            l3.next=new ListNode(l1.val);
            l3=l3.next;
            l1=l1.next;
        }
        while(l2!=null){
            l3.next=new ListNode(l2.val);
            l3=l3.next;
            l2=l2.next;
        }
        return head.next;
    }
    public ListNode mergeKLists(List<ListNode> lists) {
       if(lists.size()==0)return null;
        while(lists.size()>1){
            LinkedList<ListNode> l = new LinkedList();
            while(!lists.isEmpty()){
                ListNode l1=lists.remove(0);
                if(!lists.isEmpty()){
                    ListNode l2=lists.remove(0);
                    l.add(merge(l1,l2));
                }else{
                    l.add(l1);
                }
            }
            lists=l;
        }
        return lists.remove(0);
    }

Update 2015/08/20: 还有一种解法是使用优先队列:


/**
 * Definition for ListNode.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int val) {
 *         this.val = val;
 *         this.next = null;
 *     }
 * }
 */ 
public class Solution {
    /**
     * @param lists: a list of ListNode
     * @return: The head of one sorted list.
     */
    public ListNode mergeKLists(List<ListNode> lists) {  
        // write your code here
        if (lists.size() == 0)
			return null;
 
		//PriorityQueue is a sorted queue
		PriorityQueue<ListNode> q = new PriorityQueue<ListNode>(lists.size(),
				new Comparator<ListNode>() {
					public int compare(ListNode a, ListNode b) {
						if (a.val <= b.val)
						    return -1;
						return 1;
					}
				});
 
		//add first node of each list to the queue
		for (ListNode list : lists) {
			if (list != null)
				q.add(list);
		}
 
		ListNode head = new ListNode(0);
		ListNode p = head; // serve as a pointer/cursor
 
		while (q.size() > 0) {
			ListNode temp = q.poll();
			//poll() retrieves and removes the head of the queue - q. 
			p.next = temp;

			//keep adding next element of each list
			if (temp.next != null)
				q.add(temp.next);
 
			p = p.next;
		}
 
		return head.next;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值