剑指Offer面试题:13.合并两个排序的链表

一题目:合并两个排序的链表二代码实现将链表换成数组做简单的循环和递归测试(1)循环实现(2)递归实现

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

全栈程序员社区此处内容已经被作者隐藏,请输入验证码查看内容
验证码:
请关注本站微信公众号,回复“验证码”,获取验证码。在微信里搜索“全栈程序员社区”或者“www_javaforall_cn”或者微信扫描右侧二维码都可以关注本站微信公众号。

一 题目:合并两个排序的链表

题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。例如输入下图中的链表1和链表2,则合并之后的升序链表如链表3所示。


剑指Offer面试题:13.合并两个排序的链表

二 代码实现

template <typename T>
struct Node
{
public:
    T data;
    Node *pNext;
};

template <typename T>
class ListEx
{
private:
    Node<T> *m_pHead;
    Node<T> *m_pTail;
public:
    ListEx()
    {
        m_pTail = m_pHead = NULL;
    }
    ~ListEx()
    {
        Node<T> *pTemp = NULL;
        Node<T> *pNode = m_pHead;
        while (pNode)
        {
            pTemp = pNode;
            pNode = pNode->pNext;
            delete pTemp;
        }

        m_pHead = m_pTail = NULL;
    }
    void add(T data)
    {
        Node<T> *pNode = new Node<T>;
        pNode->data = data;
        pNode->pNext = NULL;

        if (m_pHead == NULL)
        {
            m_pTail = m_pHead = pNode;
        }

        Node<T>* pTemp = m_pTail;
        pTemp->pNext = pNode;
        m_pTail = pNode;
    }

    Node<T> *GetListHead()
    {
        return m_pHead;
    }
};
template <typename T>
Node<T>* RebuildArray(Node<T>* pNode1, Node<T>* pNode2)
{
    if (NULL == pNode1)
    {
        return pNode2;
    }
    else if (NULL == pNode2)
    {
        return pNode1;
    }
    Node<T>* pNewNode = new Node<T>;
    pNewNode = NULL;
    if (pNode1->data <= pNode2->data)
    {
        pNewNode = pNode1;
        pNewNode->pNext = RebuildArray(pNode1->pNext, pNode2);
    }
    else
    {
        pNewNode = pNode2;
        pNewNode->pNext = RebuildArray(pNode1, pNode2->pNext);
    }

    return pNewNode;
}
void main()
{
    ListEx<int> *pList1= new ListEx<int>();
    pList1->add(1);
    pList1->add(3);
    pList1->add(5);
    pList1->add(7);
    Node<int> *pHead1 = pList1->GetListHead();

    ListEx<int> *pList2= new ListEx<int>();
    pList2->add(2);
    pList2->add(4);
    pList2->add(6);
    pList2->add(8);
    Node<int> *pHead2 = pList2->GetListHead();

    Node<int>* p = RebuildArray(pHead1, pHead2);
}

将链表换成数组做简单的循环和递归测试

  (1)循环实现

void RebuildArray(int *a, int nLen1, int *b, int nLen2, int *pNew)
{
    if (NULL == a || NULL == b || 0 == nLen1 || 0 == nLen2 || NULL == pNew)
    {
        return;
    }

    int nIndex = 0;
    int i = 0;
    int j = 0;
    while (i < nLen1)
    {
        while (j < nLen2)
        {
            if (a[i] <= b[j])
            {
                pNew[nIndex++] = a[i++];
                break;
            }
            else
            {
                pNew[nIndex++] = b[j++];
            }
        }    
    }
    while(i < nLen1)
    {
        pNew[nIndex++] = a[i++];
    }
    while(j < nLen2)
    {
        pNew[nIndex++] = b[j++];
    }
}

  (2)递归实现

void RebuildArray_2(int *aStart, int *aEnd, int *bStart, int *bEnd, int *pNew)
{
    if (aStart > aEnd)
    {
        *pNew = *bStart;
        return;
    }
    else if (bStart > bEnd)
    {
        *pNew = *aStart;
        return;
    }
    if (*aStart <= *bStart)
    {
        *pNew = *aStart;
        RebuildArray_2(aStart+1, aEnd, bStart, bEnd, pNew+1);
    }
    else
    {
        *pNew = *bStart;
        RebuildArray_2(aStart, aEnd, bStart+1, bEnd, pNew+1);
    }
}
void RebuildArray_1(int *a, int nLen1, int *b, int nLen2, int *pNew)
{
    if (NULL == a || NULL == b || 0 == nLen1 || 0 == nLen2 || NULL == pNew)
    {
        return;
    }
    
    int *aStart = a;
    int *aEnd = &a[nLen1 - 1];
    int *bStart = b;
    int *bEnd = &b[nLen2 - 1];

    RebuildArray_2(aStart, aEnd, bStart, bEnd, pNew);
}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120160.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 手机游戏开发平台有哪些

    手机游戏开发平台有哪些随着近年来智能手机市场的快速发展,它所提供的丰富多彩的应用不仅开启了一个新的通讯时代,更给人们带来了一种集沟通、办公、娱乐为一体的新的生活方式。在满足人们娱乐方面,手机游戏发挥了举足轻重的作用。手机游戏开发一直以来是手机应用市场盈利份额最重的一部分,随着4G网络的逐步普及,手机应用也慢慢融入到我们生活中成为必需品。Android、iPhone、WindowsPhone和黑莓平台都非常适合独立和小…

    2022年4月28日
    82
  • oracle和mysql语法区别大吗_口语和语法的区别

    oracle和mysql语法区别大吗_口语和语法的区别最近需要迁移项目,将数据库由Oracle改为MySQL。由于两者的语法有部分不一样,所以需要把Oracle中能用但MySQL中不能用的函数/类型等改为MySQL中能用的,以下是总结出的部分语法区别:一、数据类型1.Number类型MySQL中是没有Number类型的,但有int/decimal类型,Oracle中的Number(5,1)对应MySQL中的decima…

    2022年9月14日
    1
  • android在eclipse环境下开发需要什么支持_eclipse环境配置教程

    android在eclipse环境下开发需要什么支持_eclipse环境配置教程eclipse中android环境配置java环境配置java下载去Oracle官网下载自己需要的java版本我这里选择的是windows的jdk8ps:下载需要登录自己Oracle账号,注册登录一下就行下载之后的exe文件双击开,安装到你需要安装的位置即可,我这里安装位置是D:\ProgramFiles\Java\jdk1.8.0_271环境配置在系统变量里面加入了变量JAVA_HOME,值为安装的位置然后在Path里面加入了%JAVA_HOME%\bin和%JAVA_HOME

    2022年10月5日
    2
  • 60道计算机网络面试题(附答案,背诵版)

    60道计算机网络面试题(附答案,背诵版)在大概三个月前,我在我网站就整理了计算机网络的面试题了,不过那时候才整理了20道核心的,大概过了两个月,我花了大半天去找计算机网络的面试题,因为20道肯定不够,于是我整理到了42道。不过最近我不是在整理各个公司的面经嘛?发现42道还是漏掉了不少,于是这周就又把自己整理面经看到的计算机网络面试题又补上了,一共60多道。只要把这些面试题拿下,计算机网络基本就差不多了,面试题如下?1.OSI的七层模型分别是?各自的功能是什么?2.为什么需要三次握手?两次不行?3.为什么需要四次

    2022年6月24日
    24
  • VB6.0数据库开发五个实例——罗列的总结

    VB6.0数据库开发五个实例——罗列的总结

    2021年12月15日
    36
  • navicat15 临时激活码(最新序列号破解)

    navicat15 临时激活码(最新序列号破解),https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月18日
    149

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号