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里面即可。
Update 2015/08/20: 还有一种解法是使用优先队列:
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; } }
相关文章推荐
- leetcode做题总结,题目Merge Two Sorted Lists 2012/03/30
- leetcode做题总结,题目Merge Sorted Array 2012/05/20
- LeetCode Online Judge 题目C# 练习 - Merge k Sorted Lists
- LeetCode Online Judge 题目C# 练习 - Merge Two Sorted Lists
- leetcode做题总结,题目Remove Duplicates from Sorted ListI/II 2012/04/22
- leetcode做题总结,题目Remove Duplicates from Sorted ArrayI/II--- 2012/02/16-04/19
- leetcode做题总结,题目Intersection of Two Linked Lists 2014/11/27
- [Leetcode题目]21. Merge Two Sorted Lists
- leetcode做题总结,题目Search in Rotated Sorted Array I/II 2012/03/02-12/04/09
- leetcode做题总结,题目Convert Sorted List to Binary Search Tree 2012/10/02
- [Leetcode] Merge k Sorted Lists
- [Leetcode] Merge Two Sorted Lists
- LeetCode: Merge k Sorted Lists
- [LeetCode] Merge k Sorted Lists 解题报告
- [Leetcode] Merge k Sorted Lists
- [LeetCode] Merge Two Sorted Lists
- LeetCode_Merge Two Sorted Lists
- 【LeetCode with Python】 Merge Two Sorted Lists
- LeetCode Merge k Sorted Lists
- leetcode 27: Merge k Sorted Lists