合并K个排序链表(递归)

  • 题目描述:合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
    在这里插入图片描述
  • 题目分析:该题我的思路是运用递归思想,将每个链表的头结点存储的整数值进行比较,最小的存到定义的list1节点中,然后再调用函数进行下一次比较。
  • 代码展示:
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode mergeKLists(ListNode[] lists) {
        if(lists == null || lists.length == 0) {return null;}//判断数组是否为空
        int m = 0;
        int leng = lists.length;
        ListNode list1 = new ListNode(0);//用来存储比较出来的最小节点
        list1.val = lists[0].val;
        //比较最小节点
        for(int i = 0;i < leng;i ++) {
            if(lists[i].val < list1.val) {
                list1.val = lists[i].val;
                m = i;  
            } 
        }
        lists[m] = lists[m].next;//换到下一个节点
        //若选出的最小值节点的下一节点为空即该段链表结束则将该节点删除
        if(lists[m] == null && leng > 1) {
            ListNode[] lists2 = new ListNode[leng - 1];
            for(int k = 0;k < leng - 1;k ++) {
                if(k < m) 
                    lists2[k] = lists[k];
                else 
                    lists2[k] = lists[k + 1];
            }
            list1.next = mergeKLists(lists2);//通过递归进行下一次比较
        }
        //若选定节点的下一节点不为空则正常通过递归进行下一次比较
        if(lists[m] != null)
            list1.next = mergeKLists(lists);
        return list1;//返回最后的结果
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值