力扣刷题:21.合并两个有序数组

题目要求

在这里插入图片描述

版本一:将链表放进数组里

整体思路

创建一个存储结点指针的vector,遍历两个链表的同时将对应结点的地址存入vector中

存储完毕后进行特殊值判断:如果vector为空,则返回nullptr

利用谓词和泛型算法sort按照val值<制作自定义sort
使用自定义sort对vector进行排序。

重组链表,将数组中相邻结点的next指针连接起来

返回数组头元素

(一般不推荐这么做,因为这样破坏了链表的结构,达不到训练的效果…)

代码

class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2)
{
    if (l1 == nullptr)
        return l2;
    else if(l2 == nullptr)
        return l1;
    else if(l1->val < l2->val)
    {
        l1->next = mergeTwoLists(l1->next, l2);
        return l1;
    }
    else
    {
        l2->next = mergeTwoLists(l1, l2->next);
        return l2;
    }
}
};

学到了什么

1、第一次使用谓词自定义泛型算法sort,搞清楚泛型算法sort的原理
根据c++技术文档里面的记载:
在这里插入图片描述将红框的语句翻译一下:
返回的(布尔)值指示作为第一个参数传递的元素在其定义的特定严格弱顺序中是否被认为先于第二个参数。

也就是说,sort将范围内的两个参数a、b传进谓词函数里
如果函数返回值为true,第一个参数先于第二个参数,则应该把第一个参数a排在第二个参数b之前。
如果函数返回值为false,第一个参数不先于第二个参数,则应该把第一个参数a排在第二个参数b之后。

参考文档

2、解决了一个类函数指针的bug
第一次提交时遇到一个错误:reference to non-static member function must be called
一开始是这样的:谓词函数是类内函数

std::sort(v.begin(), v.end(), mySort);
bool mySort(ListNode *n1, ListNode *n2)
{
  return n1->val < n2->val;
}

类内函数和普通函数稍微有些不一样,一个类有多个实例对象:
类的数据成员是私有的,每个对象拥有自己的数据。
类的成员函数是公有的,每个对象共用同一个成员函数。

在使用某一个实例对象调用成员函数时,会隐式的添加一个*this参数用于标识自身,这就导致了谓词参数与sort要求的不符,所以就报错了。

解决方案:将谓词函数改成静态成员函数或者类外全局函数就可以解决了。
参考文章

版本二:递归

整体思路

每次从两个链表中选取一个较小值的结点进行连接

代码

class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2)
{
    if (l1 == nullptr)
        return l2;
    else if(l2 == nullptr)
        return l1;
    else if(l1->val < l2->val)
    {
        l1->next = mergeTwoLists(l1->next, l2);
        return l1;
    }
    else
    {
        l2->next = mergeTwoLists(l1, l2->next);
        return l2;
    }
}
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值