题目要求
版本一:将链表放进数组里
整体思路
创建一个存储结点指针的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;
}
}
};