您的位置:首页 > 其它

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

2014-07-26 16:58 381 查看
题目是一个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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: