两路归并的数组与链表的实现方法

 更新时间:2013年05月07日 11:03:46   作者:  
本篇文章对两路归并的数组与链表的实现方法进行了分析介绍。需要的朋友参考下

复制代码 代码如下:

#include<iostream>
#include<assert.h>
using namespace std;
struct node
{
    int val;
    node * next;
    node(int v)
    {
        val=v;
        next=NULL;
    }
};

node * merge(node* list1 , node * list2)
{
    assert(list1!=NULL&&list2!=NULL);
    node * res;
    if(list1->val<=list2->val)
    {
        res=list1;
        list1=list1->next;
    }
    else
    {
        res=list2;
        list2=list2->next;
    }
    node * p = res;
    node *p1 =list1,*p2 =list2;

    while(p1!=NULL&&p2!=NULL)
    {
        if(p1->val<=p2->val)
        {
            p->next=p1;
            p=p->next;
            p1=p1->next;
        }
        else
        {
            p->next=p2;
            p=p->next;
            p2=p2->next;
        }
    }

    while(p1!=NULL)
    {
        p->next=p1;
        p=p->next;
        p1=p1->next;
    }
    while(p2!=NULL)
    {
        p->next=p2;
        p=p->next;
        p2=p2->next;
    }
    return res;
}

int * merge(int * arr1,int la, int * arr2,int lb)
{
    int i=0,j=0;
    int * arr = new int[la+lb];
    int t=0;
    while(i<la&&j<lb)
    {
        if(arr1[i]<=arr2[j])
        {
            arr[t++]=arr1[i];
            i++;
        }
        else
        {
            arr[t++]=arr2[j];
            j++;
        }
    }
    while(i<la)
    {
        arr[t++]=arr1[i];
        i++;
    }
    while(j<lb)
    {
        arr[t++]=arr2[j];
        j++;
    }
    return arr;
}

void setLinkData(node * & list1 , node * & list2)
{
    node * node1 = new node(2);
    node * node2 = new node(3);
    node * node3 = new node(7);
    node * node4= new node(9);
    node1->next=node2;
    node2->next=node3;
    node3->next=node4;
    list1=node1;

    node * node5 = new node(1);
    node * node6 = new node(4);
    node * node7 = new node(6);
    node * node8 = new node(8);
    node5->next=node6;
    node6->next=node7;
    node7->next=node8;
    list2=node5;
}

int main()
{
    node * list1;
    node * list2;
    setLinkData(list1,list2);
    int arr1[]={1,6,15,17,19};
    int arr2[]={2,4,6,8,10};
    int * arr = merge(arr1,5,arr2,5);
    node * ans = merge(list1,list2);
    //Print result
    int length=10;
    for(int i=0;i<10;i++)
    {
        cout<<*arr<<endl;
        arr++;
    }
    while(ans!=NULL)
    {
        cout<<ans->val<<endl;
        ans=ans->next;
    }
    return 0;
}

相关文章

  • C#写入对象或集合类型数据到xml文件的方法

    C#写入对象或集合类型数据到xml文件的方法

    这篇文章主要介绍了C#写入对象或集合类型数据到xml文件的方法,涉及C#针对XML文件的相关操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • C# Main方法的传入参数研究

    C# Main方法的传入参数研究

    这篇文章主要介绍了C# Main方法的传入参数研究,相信大家不管是在java中还是C#中都经常见到public static void Main(string[] args)类似的语句,那这个args到底有什么用,你又知道多少呢?本文就专门研究了这个参数,相信可以让涨姿势,需要的朋友可以参考下
    2015-06-06
  • C# Winform下载文件并显示进度条的实现代码

    C# Winform下载文件并显示进度条的实现代码

    本来是要研究怎样判断下载完成,结果找到这个方法,可以在这个方法完成之后提示下载完成,需要的朋友可以参考下
    2014-07-07
  • 解析c#操作excel后关闭excel.exe的方法

    解析c#操作excel后关闭excel.exe的方法

    C#和Asp.net下excel进程一被打开,有时就无法关闭,尤其是website.对关闭该进程有过GC、release等方法,但这些方法并不是在所有情况下均适用
    2013-07-07
  • WPF如何绘制光滑连续贝塞尔曲线示例代码

    WPF如何绘制光滑连续贝塞尔曲线示例代码

    贝塞尔曲线,又称贝兹曲线或贝济埃曲线,一般的矢量图形软件通过它来精确画出曲线,下面这篇文章主要给大家介绍了关于WPF如何绘制光滑连续贝塞尔曲线的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下。
    2018-04-04
  • C#绘制实时曲线图的方法详解

    C#绘制实时曲线图的方法详解

    这篇文章主要为大家详细介绍了如何利用C#绘制实时曲线图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • C#使用读写锁三行代码简单解决多线程并发的问题

    C#使用读写锁三行代码简单解决多线程并发的问题

    本文主要介绍了C#使用读写锁三行代码简单解决多线程并发写入文件时提示“文件正在由另一进程使用,因此该进程无法访问此文件”的问题。需要的朋友可以参考借鉴
    2016-12-12
  • C#判断三角形的类型

    C#判断三角形的类型

    这篇文章主要介绍了C#判断三角形的类型的方法,通过输入三角形的三条边长,判断是否能构成一个三角形,感兴趣的小伙伴们可以参考一下
    2015-11-11
  • C#中datagridview的EditingControlShowing事件用法实例

    C#中datagridview的EditingControlShowing事件用法实例

    这篇文章主要介绍了C#中datagridview的EditingControlShowing事件用法,实例分析了datagridview的EditingControlShowing事件的定义与使用技巧,需要的朋友可以参考下
    2015-06-06
  • C#使用NPOI实现将表格中数据导入Excel

    C#使用NPOI实现将表格中数据导入Excel

    NPOI是.NET版本的POI,可以帮助我们在没有安装Microsoft Office的情况下读写Office文件,下面我们就来看看C#如何使用NPOI实现将表格中数据导入Excel吧
    2025-02-02

最新评论