牛客Top200---合并k个有序链表(java)

Posted 小样5411

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了牛客Top200---合并k个有序链表(java)相关的知识,希望对你有一定的参考价值。

题目

分析

首先你要会写合并两个有序链表,这个题目就是合并两个链表的变形,如果懂合并两个,那么合并k个也就不难了,只要弄一个遍历即可,一开始最前面两个合并,将合并的结果与第一个合并,以此类推,每次都进行两个两个合并,知道和最后一个合并完毕,思路都不难

代码

import java.util.*;

public class Solution {
    public ListNode mergeKLists(ArrayList<ListNode> lists) {
        //思路:k个有序链表合并,就是进行多次两个有序链表的合并
        //首先若k=0,即为空,则直接返回null
        if(lists == null || lists.size() == 0){
            return null;
        }
        //若k=1,则直接返回这个链表,无需要排序
        if(lists.size() == 1){
            return lists.get(0);
        }
        //若k>1,则执行合并,先前两个合并,将合并后的结果再和后面的链表合并
        //遍历合并
        ListNode node = lists.get(0);
        for(int i = 1 ; i < lists.size() ; i++){
            node = mergeTwoList(node,lists.get(i));
        }
        return node;
    }
    
    private ListNode mergeTwoList(ListNode node1,ListNode node2){
        ListNode temp = new ListNode(-1);//头结点,记录两个合并的链表
        ListNode node = temp;//记录这个头结点,后面用于返回合并后的第一个节点node.next
        while(node1 != null && node2 != null){
            //小的先连到temp的后面
            if(node1.val < node2.val){
                temp.next = node1;
                node1 = node1.next;
            }else{
                temp.next = node2;
                node2 = node2.next;
            }
            temp = temp.next;
        }
        //若node1或者node2没有执行完,则直接连接到temp后面
        if(node1 != null){
            temp.next = node1;
        }
        if(node2 != null){
            temp.next = node2;
        }
        //返回合并后的第一个节点
        return node.next;
    }
}

以上是关于牛客Top200---合并k个有序链表(java)的主要内容,如果未能解决你的问题,请参考以下文章

java牛客BM4.合并两个排序的链表 BM5. 合并k个已排序的链表

牛客Top200---删除链表中倒数第n个结点(java详解)

牛客Top200---链表中的节点每k个一组翻转(java通俗易懂详解)

牛客Top200---合并两个有序数组

合并K个有序链表

牛客Top200---判断一个链表是否为回文结构(java图解)