LeetCode 23. Merge k Sorted Lists

男娘i 2022-05-11 14:34 243阅读 0赞

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

Example:

  1. Input:
  2. [
  3. 1->4->5,
  4. 1->3->4,
  5. 2->6
  6. ]
  7. Output: 1->1->2->3->4->4->5->6

hard

discuss中解法1:使用优先队列

  1. /**
  2. * Definition for singly-linked list.
  3. * public class ListNode {
  4. * int val;
  5. * ListNode next;
  6. * ListNode(int x) { val = x; }
  7. * }
  8. */
  9. class Solution {
  10. public ListNode mergeKLists(ListNode[] lists) {
  11. if(lists==null || lists.length==0) return null;
  12. PriorityQueue<ListNode> pq = new PriorityQueue<>(lists.length, new Comparator<ListNode>(){
  13. public int compare(ListNode l1, ListNode l2){
  14. return l1.val - l2.val;
  15. };
  16. });
  17. ListNode dummy = new ListNode(0);
  18. ListNode tail = dummy;
  19. //相当于初始化优先队列,将每一个链表的头结点放入队列,将会从小到大排序
  20. for(ListNode l : lists){
  21. if(l!=null)
  22. pq.offer(l);
  23. }
  24. //队列不为空时,tail指向队首,然后将弹出的队首所在链表看是否还有节点,有则继续加入队列
  25. //队列中每次只保留每个链表的头结点
  26. while(!pq.isEmpty()){
  27. tail.next = pq.poll();
  28. tail = tail.next;
  29. if(tail.next!=null){
  30. pq.offer(tail.next);
  31. }
  32. }
  33. return dummy.next;
  34. }
  35. }

submission中解法2:分解成子问题,最终使用二分归并排序算法

  1. /**
  2. * Definition for singly-linked list.
  3. * public class ListNode {
  4. * int val;
  5. * ListNode next;
  6. * ListNode(int x) { val = x; }
  7. * }
  8. */
  9. class Solution {
  10. public ListNode mergeKLists(ListNode[] lists) {
  11. return divide(lists, 0, lists.length - 1);
  12. }
  13. private ListNode divide(ListNode[] lists, int start, int end){
  14. if(start > end){
  15. return null;
  16. }
  17. if(start == end){
  18. return lists[start];
  19. }
  20. int mid = start + (end - start) / 2;
  21. ListNode left = divide(lists, start, mid);
  22. ListNode right = divide(lists, mid + 1, end);
  23. return merge(left, right);
  24. }
  25. private ListNode merge(ListNode l1, ListNode l2){
  26. ListNode head = new ListNode(0);
  27. ListNode curr = head;
  28. while(l1 != null || l2 != null){
  29. if(l1 != null && l2 != null){
  30. if(l1.val < l2.val){
  31. curr.next = l1;
  32. l1 = l1.next;
  33. }else{
  34. curr.next = l2;
  35. l2 = l2.next;
  36. }
  37. }else if(l1 != null){
  38. curr.next = l1;
  39. l1 = l1.next;
  40. }else{
  41. curr.next = l2;
  42. l2 = l2.next;
  43. }
  44. curr = curr.next;
  45. }
  46. return head.next;
  47. }
  48. }

发表评论

表情:
评论列表 (有 0 条评论,243人围观)

还没有评论,来说两句吧...

相关阅读