数据结构_线性表的应用_线性表的归并(java实现)

这篇文章讲述的是数据结构部分的线性表的应用的java实现,如有错误或者不当之处,还望各位大神批评指正。

问题描述

一直两个线性表L1和L2中的元素已经按非递减有序排列现要求将L1和L2归并为一个新的线性表L3且扔按非递减有序排列

算法分析

  1. 借助第三个线性表长度足以放下这两个线性表长度为L1.length+L2.length
  2. 通过两个指针分别指向L1和L2用于遍历其中 的的元素
  3. 将两个指针所指的元素的较小值放入L3中
  4. 时间复杂度:O(n) 空间复杂度:O(n)

代码实现

package List_question;

import list.LinkList;
import list.List;

/**
 * @author 叶清逸
 * @date 2018年7月20日下午4:27:28
 * @version 1.0
 * @project dataStructureQuestion
 */
public class Q1_MergeList{
    /**
     * 问题分析:一直两个线性表L1和L2中的元素已经按非递减有序排列现要求将L1和L2归并为一个新的线性表L3且扔按非递减有序排列
     * 
     * 算法分析:1. 借助第三个线性表长度足以放下这两个线性表长度为L1.length+L2.length
     *          2. 通过两个指针分别指向L1和L2用于遍历其中 的的元素
     *          3. 将两个指针所指的元素的较小值放入L3中
     * 
     * 复杂度分析:时间复杂度:O(n) 空间复杂度:O(n) 
     */

    public static void main(String[] args) {
        /*初始化L1和L2并放入数据*/
        List L1 = new LinkList() ;
        L1.init();
        L1.put(3);
        L1.put(5);
        L1.put(8);
        L1.put(11);

        List L2 = new LinkList() ;
        L2.init();
        L2.put(2);
        L2.put(6);
        L2.put(8);
        L2.put(9);
        L2.put(11);
        L2.put(15);
        L2.put(20);

        System.out.print("L1:");
        L1.print();
        System.out.print("L2:");
        L2.print();

        /*执行合并操作*/
        List L3 = merge(L1 , L2) ;
        /*输出结果*/
        System.out.print("L3:");
        L3.print();
    }

    /**
     * @explain merge方法:将有序线性表L1和L2合并
     * @param L1 线性表L1
     * @param L2 线性表L2
     * @return SequenceList 返回合并后的线性表
     * @throws 
     * @author 叶清逸
     * @date 2018年7月20日 下午4:27:44
     */
    public static List merge(List L1 , List L2){
        /*初始化顺序表L3,由于我定义的线性表是自动扩展长度的所以不用指明初始长度*/
        List L3 = new LinkList() ;
        L3.init();

        /*定义两个变量用来表示遍历的索引*/
        int i = 1 ; 
        int j = 1 ;
        /*遍历两个顺序表*/
        /*情况一:两个表都有没遍历完时*/
        while(i<=L1.length() && j<=L2.length()){
            /*读取索引所指的元素*/
            int p = (int) L1.get(i) ;
            int q = (int) L2.get(j) ;
            /*共可能有如下两种情况*/
            if(p <= q){
                L3.put(p);
                i++ ;
            }else if(p > q){
                L3.put(q) ;
                j++ ;
            }
        }
        /*情况二:表L1没有遍历完而表L2已经遍历完*/
        while(i <= L1.length()){
            /*读取索引所指的元素*/
            int p = (int) L1.get(i) ;
            /*放入元素*/
            L3.put(p);
            i++ ;
        }
        /*情况三:表L1已经遍历完而表二没有遍历完*/
        while(j <= L2.length()){
            /*读取索引所指的元素*/
            int q = (int) L2.get(j) ;
            L3.put(q);
            j++ ;
        }

        return L3 ;
    }
}

样例输出

L1:3 5 8 11 
L2:2 6 8 9 11 15 20 
L3:2 3 5 6 8 8 9 11 11 15 20 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值