题源:
描述
输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的。
数据范围: 0≤n≤1000,−1000≤节点值≤1000
要求:空间复杂度 O(1),时间复杂度 O(n)
如输入{1,3,5},{2,4,6}时,合并后的链表为{1,2,3,4,5,6},所以对应的输出为{1,2,3,4,5,6},转换过程如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/62a995f134a77a6ab4e239ccc73fdfe1.png)
或输入{-1,2,4},{1,3,4}时,合并后的链表为{-1,1,2,3,4,4},所以对应的输出为{-1,1,2,3,4,4},转换过程如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/c4c06c95e732bb1a7d98d931e5f573e7.png)
示例1
输入:
{1,3,5},{2,4,6}
返回值:
{1,2,3,4,5,6}
示例2
输入:
{},{}
返回值:
{}
示例3
输入:
{-1,2,4},{1,3,4}
返回值:
{-1,1,2,3,4,4}
思路:
递归求解,用递归比较值,保留较小结点 , 递归较大结点。然后合并
题解:
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* Merge(ListNode* list1, ListNode* list2) {
if(!list1)
return list2;//这是递归的出口
if(!list2)
return list1;//这是递归的出口
if(list1->val<list2->val){
//这步操作就是提出最矮的那个(当前是list1->val最小),然后继续比较后续两个队伍的人
//list1->next就是指向后续比较出最矮的那个人
list1->next=Merge(list1->next,list2);
//每次比较完,需要返回第一个节点的地址,以便最后递归结束,从后往前返回地址,连接起来
return list1;
}else{
list2->next=Merge(list1,list2->next);
return list2;
}
}
};