面试必刷TOP101:5、合并k个已排序的链表
  9ShvDtAiXXil 2023年11月02日 66 0

一、题目

面试必刷TOP101:5、合并k个已排序的链表_java

二、题解

顺序合并解题思路

1、将k个链表配对并将同一对中的链表进行合并(采用顺序合并的方法)

2、第一轮合并后,k个链表合并成了 k/2 个链表,平均长度 2n/k ,然后是 k/4、k/8...等等

3、重复这一过程,知道获取最终的有序链表

面试必刷TOP101:5、合并k个已排序的链表_java_02

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(ArrayListlists) {
        // 采用分治进行合并链表
        return mergeList( lists , 0 , lists.size() - 1 );
    }
    // 分治进行链表两两合并
    public ListNode mergeList(ArrayListlists , int L ,int R){
        
        if(L == R){
            return lists.get(L);
        }
        if(L > R){
            return null;
        }
        
        int mid = L + ((R - L) >> 1);
        return merge( mergeList(lists,L,mid) , mergeList(lists,mid+1,R));
    }
    
    // 合并两个链表,对比合并
    public ListNode merge(ListNode l1 , ListNode l2){
        
        if(l1 == null || l2 == null){
            return l1 == null ? l2 : l1;
        }
        
        ListNode dummy = new ListNode(-1);
        ListNode cur = dummy;
        
        while( l1 != null && l2 != null){
            
            if(l1.val < l2.val){
                cur.next = l1; l1 = l1.next; 
            }
            else{ 
                cur.next = l2; l2 = l2.next; 
            } 
            cur = cur.next; 
        } 
        cur.next = (l1 == null ? l2 : l1); return dummy.next; 
    } 
}
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  2Vtxr3XfwhHq   2024年05月17日   55   0   0 Java
  Tnh5bgG19sRf   2024年05月20日   113   0   0 Java
  8s1LUHPryisj   2024年05月17日   48   0   0 Java
  aRSRdgycpgWt   2024年05月17日   47   0   0 Java
9ShvDtAiXXil