合并 K 个升序链表

发布时间 2023-10-24 09:32:58作者: cojames

 例如在一个数组里存放几组链表,要解决按照升序合并这几个链表可以按照合并两个链表的思想,比较val大小,小的被链接,然后指针后移,但由于是数组所以需要遍历找到最小的几组链表里最小的那个节点,以及在数组中的位置,其方法就是按照链表特性每次比较子数组的中的head节点,即例如lists[0]的第一个节点lists[1]的第一个,lists[2]的第一个,谁小谁被记录然后咋该节点组内后移,后移的那个节点作为新的第一个节点。

 

 

*最核心的一点就是尾插最小节点后需要将最小的节点所在的那一组进行指针后移操作,不然下一次就没办法比较后一组数据

lists[Pointer]=lists[Pointer].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) {
        int len=lists.length;
        ListNode dummy=new ListNode(0);
        ListNode tail=dummy;
        while(true){
            ListNode minNode=null;
            int Pointer=-1;
            //寻找值最小的节点
            for(int i=0;i<len;i++){
                if(lists[i]==null){
                    continue;
                }
                if(minNode==null|| lists[i].val<minNode.val){
                    //值最小的节点
                    minNode=lists[i];
                    //值最小节点的位置
                    Pointer=i;
                }
                
            }
            //k组链表均为空直接跳出循环
            if(Pointer==-1){
                    break;
                }
            //尾指针链接值最小的节点
            tail.next=minNode;
            tail=tail.next;
            //组内下移
            lists[Pointer]=lists[Pointer].next;

        }
        return dummy.next;
    }
}