常考数据结构与算法:合并k个已排序的链表

 

题目描述

合并\ k k 个已排序的链表并将其作为一个已排序的链表返回。分析并描述其复杂度。 

 

示例1

输入

[{1,2,3},{4,5,6,7}]

返回值

{1,2,3,4,5,6,7}
import java.util.ArrayList;

public class MergeKLists {
    public static void main(String[] args) {
        // [{-1,1},{-3,1,4},{-2,-1,0,2}]
        ListNode a0 = new ListNode(-1);
        ListNode b0 = new ListNode(1);
        a0.next = b0;

        ListNode a = new ListNode(-3);
        ListNode b = new ListNode(1);
        ListNode c = new ListNode(4);
        a.next = b;
        b.next = c;

        ListNode a1 = new ListNode(-2);
        ListNode b1 = new ListNode(-1);
        ListNode c1 = new ListNode(0);
        ListNode d1 = new ListNode(2);
        a1.next = b1;
        b1.next = c1;
        c1.next = d1;
        ArrayList<ListNode> lists = new ArrayList<>();
        lists.add(a0);
        lists.add(a);
        lists.add(a1);

        MergeKLists k = new MergeKLists();
        ListNode result = k.mergeKLists(lists);
        k.showListNode(result);
    }

    public static void showListNode(ListNode result){
        while(null != result){
            System.out.println(result.val);
            result = result.next;
        }
    }

    public ListNode mergeKLists(ArrayList<ListNode> lists) {

        if(null == lists){
            return null;
        }

        ListNode newHead = new ListNode(-1);
        ListNode first = null;
        ListNode second = null;
        ListNode temp = null;
        for(ListNode listNode : lists){
         // 循环每一个链表,两两合并成一个新的链表,用合并好的新的链表用作和下一次循环的链表比较
            second = listNode;

                first = newHead.next;
                temp = newHead;
                while(null != first && null != second){
                    if(first.val < second.val){
                        temp.next = first;
                        temp = first;
                        first = first.next;
                    }else{
                        temp.next = second;
                        temp = second;
                        second = second.next;
                    }
                }

                if(null != first){
                    temp.next = first;
                }

                if(null != second){
                    temp.next = second;
                }
            }


        return newHead.next;
    }
}


class ListNode {
    int val;
    ListNode next = null;

    ListNode() {
    }

    ListNode(int val) {
        this.val = val;
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据结构与算法八股文是一个常见的面试问题,主要考察对数据结构和算法的理解和应用能力。以下是一个典型的数据结构与算法八股文: 1. 数组 - 数组的特点和使用场景 - 常见的数组操作:增删改查、旋转、反转等 - 数组的时间复杂度和空间复杂度分析 2. 链表 - 链表的特点和种类:单链表、双链表、循环链表等 - 常见的链表操作:插入、删除、反转、合并等 - 链表的时间复杂度和空间复杂度分析 3. 栈和队列 - 栈和队列的特点和应用场景 - 栈和队列的实现方式:数组实现、链表实现等 - 常见的栈和队列操作:入栈、出栈、入队、出队等 4. 树和二叉树 - 树和二叉树的特点和应用场景 - 树和二叉树的遍历方式:前序、中序、后序、层次遍历等 - 常见的树和二叉树操作:插入、删除、查找等 5. 图 - 图的特点和应用场景 - 图的表示方式:邻接矩阵、邻接表等 - 常见的图算法:深度优先搜索、广度优先搜索、最短路径、最小生成树等 6. 排序算法 - 常见的排序算法:冒泡排序、插入排序、选择排序、快速排序、归并排序等 - 排序算法的时间复杂度和稳定性分析 - 如何选择合适的排序算法 7. 查找算法 - 常见的查找算法:顺序查找、二分查找、哈希查找等 - 查找算法的时间复杂度和空间复杂度分析 - 如何选择合适的查找算法 8. 动态规划 - 动态规划的基本思想和应用场景 - 动态规划问题的特征和求解方法 - 如何优化动态规划问题的时间复杂度

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值