LeetCode 23. 合并K个升序链表--bug解法

681 阅读1分钟

给你一个链表数组,每个链表都已经按升序排列。

请你将所有链表合并到一个升序链表中,返回合并后的链表。

示例 1:

输入:lists = [[1,4,5],[1,3,4],[2,6]]
输出:[1,1,2,3,4,4,5,6]
解释:链表数组如下:
[
  1->4->5,
  1->3->4,
  2->6
]
将它们合并到一个有序链表中得到。
1->1->2->3->4->4->5->6

示例 2:

输入:lists = []
输出:[]

示例 3:

输入:lists = [[]]
输出:[]

提示:

k == lists.length
0 <= k <= 10^4
0 <= lists[i].length <= 500
-10^4 <= lists[i][j] <= 10^4
lists[i] 按 升序 排列
lists[i].length 的总和不超过 10^4


来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-k-sorted-lists
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
  public ListNode mergeKLists(ListNode[] lists) {
  }
}

BUG解法

思路:将所有链表值放入 List,然后排序,最后一个一个的生成结点~~~

/** * Definition for singly-linked list. * public class ListNode { *     int val; *     ListNode next; *     ListNode() {} *     ListNode(int val) { this.val = val; } *     ListNode(int val, ListNode next) { this.val = val; this.next = next; } * } */class Solution {  public ListNode mergeKLists(ListNode[] lists) {    List<Integer> list = new ArrayList<>();    for (ListNode listNode : lists) {      while (listNode != null) {        list.add(listNode.val);        listNode = listNode.next;      }    }    Collections.sort(list);    ListNode head = new ListNode();    ListNode temp = head;    for (Integer integer : list) {      temp.next = new ListNode(integer);      temp = temp.next;    }    return head.next;  }}

按照两个有序链表合并的解法

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
  public ListNode mergeKLists(ListNode[] lists) {
    ListNode result = new ListNode();
    for (ListNode node : lists) {
      ListNode temp = result;
      while (node != null) {
        if (temp.next == null) {
          temp.next = node;
          break;
        }
        if (temp.next.val >= node.val) {
          temp.next = new ListNode(node.val, temp.next);
          temp = temp.next;
          node = node.next;
        } else {
          temp = temp.next;
        }
      }
    }
    return result.next;
  }
}

分治合并

使用优先队列合并

参见 LeetCode 中文官网