leetcode 23.合并k个升序链表

这篇博客介绍了如何合并已排序的链表。提供了两种解决方案:迭代合并和归并排序。迭代合并是通过逐个合并链表来实现,而归并排序则是采用分治思想,将链表两两合并,直至所有链表合并成一个。代码示例使用Java实现,包括合并两个链表的辅助方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、题目

给你一个链表数组,每个链表都已经按升序排列。

请你将所有链表合并到一个升序链表中,返回合并后的链表。

 

示例 1:

输入:lists = [[1,4,5],[1,3,4],[2,6]]
输出:[1,1,2,3,4,4,5,6]
解释:链表数组如下:
[
1->4->5,
1->3->4,
2->6
]
将它们合并到一个有序链表中得到。
1->1->2->3->4->4->5->6

示例 2:

输入:lists = []
输出:[]

示例 3:

输入:lists = [[]]
输出:[]

 

提示:

  • k == lists.length
  • 0 <= k <= 10^4
  • 0 <= lists[i].length <= 500
  • -10^4 <= lists[i][j] <= 10^4
  • lists[i]升序 排列
  • lists[i].length 的总和不超过 10^4

 

2、解题思路

(1)解决方案一:迭代合并;先合第一个第二个,合之后再合第三个,之后合第四个,一直到把所有链表合并完成返回头节点;

(2)解决方案二:归并(分治思想);两个两个合并不断的往上合(一二合并,三四合并,五六合并,之后再对合并之后的进行合并)

 

3、java代码

(1)解决方案一:迭代合并;

public ListNode mergeKLists(ListNode[] lists) {
        //判空
        if(lists==null||lists.length<1) return null;
        if(lists.length==1) return lists[0];


        //遍历数组挨个合并返回最后的节点
        ListNode cur=lists[0];
        for(int i=1;i<lists.length;i++){
             cur= mergeTwoLists(cur,lists[i]);
        }
        return cur;
    }

    //合并两个数组返回表头的方法
    public static ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        //判空
        if (l1==null) return l2;
        if (l2==null) return l1;

        //新增哨兵节点
        ListNode dummyNode=new ListNode(-1);
        ListNode pre=dummyNode;

        //比较元素,找到next;然后接着进行判断
        ListNode cur1=l1;
        ListNode cur2=l2;
        while(cur1!=null &&cur2!=null){
            if(cur1.val<=cur2.val){
                pre.next=cur1;
                pre=cur1;
                cur1=cur1.next;
            }else{
                pre.next=cur2;
                pre=cur2;
                cur2=cur2.next;
            }

        }
        if(cur1==null) pre.next=cur2;
        if(cur2==null) pre.next=cur1;
        //返回头节点
        return dummyNode.next;
    }

(2)解决方案二:归并(分治思想);

 public ListNode mergeKLists1(ListNode[] lists) {
         //判空
        if(lists==null||lists.length<1) return null;
        if(lists.length==1) return lists[0];
         //调用归并的方法

        return merge(lists,0,lists.length-1);
    }

    public ListNode merge(ListNode[] lists,int left,int right){
        //终止条件
        if(left==right)return lists[left];
        if(left>right) return null;

        //拆解
        int mid = left + (right - left) / 2;
        ListNode mergeLeft=merge(lists,left,mid);
        ListNode mergeRight=merge(lists,mid+1,right);

        //合并
        return mergeTwoLists(mergeLeft,mergeRight);   //这个调用的方法就是上面那个合并俩链表的方法,这里不重复放了

    }


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值