题解 | #合并k个已排序的链表#

合并k个已排序的链表

https://www.nowcoder.com/practice/65cfde9e5b9b4cf2b6bafa5f3ef33fa6

import java.util.*;
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */

// 归并思想 + 基础两两链表相加操作
public class Solution {
    public ListNode mergeKLists(ArrayList<ListNode> lists) {
        
        return divideMerge(lists,0,lists.size()-1);

    }

    // 归并思想
    public ListNode divideMerge(ArrayList<ListNode> lists,int left,int right) {

        // 首先判断是否可以归并
        if(left > right){
            return null;
        }else if(left == right){
            return lists.get(left);
        }

        // 分为左右两侧归并
        int mid = (left + right) / 2;

        // 返回值是最终链表,采用递归不断进行左右两两链表合并
        return mergeTwo(divideMerge(lists,left,mid),divideMerge(lists,mid+1,right));
    }

    // 两两链表合并操作
    public ListNode mergeTwo(ListNode list1,ListNode list2){
        
        // 先判断是否有数据
        if(list1 == null || list2 == null){
            if(list1 == null){
                return list2;
            }else if(list2 == null){
                return list1;
            }
        }

        // 设置返回头
        ListNode head = new ListNode(-1001);

        // 设置i
        ListNode i = head;

        // 双方都有数据时进行比较大小并改变next
        while(list1 != null && list2 != null){

            if(list1.val > list2.val){

                i.next = list2;

                i = i.next;

                list2 = list2.next;
                
            }else{
                i.next = list1;

                i = i.next;

                list1 = list1.next;
            }

        }

        // 无数据时直接将另一方加入链表即可
        if(list1 == null){
            i.next = list2;
        }else{
            i.next = list1;
        }

        return head.next;

    }
}

全部评论

相关推荐

可可可可可_:nb啊,看样子是专科玩了几年随便专升本了个民办,又玩了两年。你这能找到我吃
点赞 评论 收藏
分享
object3:开始给部分🌸孝子上人生第一课了
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务