《LeetCode之每日一题》:137.合并两个有序链表
Posted 是七喜呀!
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《LeetCode之每日一题》:137.合并两个有序链表相关的知识,希望对你有一定的参考价值。
题目链接: 合并两个有序链表
有关题目
将两个升序链表合并为一个新的 升序 链表并返回。
新链表是通过拼接给定的两个链表的所有节点组成的。
示例 2:
输入:l1 = [], l2 = []
输出:[]
示例 3:
输入:l1 = [], l2 = [0]
输出:[0]
提示:
两个链表的节点数目范围是 [0, 50]
-100 <= Node.val <= 100
l1 和 l2 均按 非递减顺序 排列
题解
法一:递归
代码一:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if (!l1 || !l2){
return !l1 ? l2 : l1;
}
ListNode* newHead = l1->val > l2->val ? l2 : l1;
newHead->next = l1->val > l2->val ? mergeTwoLists(l1, l2->next) : mergeTwoLists(l1->next, l2);
return newHead;
}
};
代码二:
参考官方题解
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(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){
l2->next = mergeTwoLists(l1, l2->next);
return l2;
}
else {
l1->next = mergeTwoLists(l1->next, l2);
return l1;
}
}
};
法二:迭代
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode *newList = new ListNode(-1);//动态开辟一个节点,存放值为-1
ListNode *preList = newList;
while(l1 && l2){
if (l1->val > l2->val){
preList->next = l2;
l2 = l2->next;
}
else {
preList->next = l1;
l1 = l1->next;
}
//每次偏移一步,移动preList节点
preList = preList->next;
}
//l1 与 l2 中至多有一个为遍历完,我们只需将未遍历完的直接赋值
preList->next = l1 == nullptr ? l2 : l1;
return newList->next;
}
};
时间复杂度:O(m + n),循环遍历不会超过两个链表的长度之和
空间复杂度:O(1)
以上是关于《LeetCode之每日一题》:137.合并两个有序链表的主要内容,如果未能解决你的问题,请参考以下文章