day17 leetcode-hot100-34(链表13)

23. 合并 K 个升序链表 - 力扣(LeetCode)

day17 leetcode-hot100-34(链表13)_第1张图片

1.数组排序

思路

(1)将全部的节点存储到数组中

(2)对数组进行排序

(3)最后创建一个全新的链表

具体代码
/**
 * 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) {
        int len=0;
        for(int i=0;i

2.两两比较合成链表

思路

两两合并,也就是for循环,每次两个链表进行合并,最后输出结果。

具体步骤:

(1)判断链表是否为空,不是空则p=lists[0]

(2)将p与lists中下一个列表合并,采用之前写过的两两合并方法。

(3)每次结束后后需要将p归为到原始节点,重新与下一个链表合并。

具体代码
/**
 * 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) {
        if(lists.length==0){
            return null;
        }
        
        ListNode p = lists[0];  
        for(int i=1 ; i

3.优先队列

思路

将链表放入优先队列中(小顶堆),每次循环都去最小的加入新链表,直到队列为空。

具体步骤:
(1)构造优先队列

(2)将各个链表的首节点放入队列

(3)将最小的节点加入链表,然后该节点进入下一个位置,如果不是空的,则加入队列。

具体代码
/**
 * 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) {
        PriorityQueue pq = new PriorityQueue<>((o1,o2)->{return o1.val-o2.val;});
        for(ListNode node:lists){
            if(node!=null){
                pq.offer(node);
            }
        }
        ListNode ans = new ListNode();
        ListNode cur = ans;

        while(!pq.isEmpty()){
            ListNode s=pq.poll();
            cur.next=s;
            cur=cur.next;
            if(s.next!=null){
                s=s.next;
                pq.offer(s);
            }

        }
        return ans.next;
        
    }
}

你可能感兴趣的:(leetcode,链表,算法)