题解
方法1:顺序比较
主要思路
比较两个链表头部的两个节点,选择较小的一个加入到新的链表的末端,循环往复
源代码:c++
/**
* 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* list1, ListNode* list2) {
ListNode* head;
ListNode* lastNode;
if(list1 == nullptr)
return list2;
else if(list2 == nullptr)
return list1;
if(list1->val < list2->val)
{
head = list1;
list1 = list1->next;
}
else
{
head = list2;
list2 = list2->next;
}
lastNode = head;
while(1)
{
// 检测是否到达末尾,如果是则将其他部分拼接后直接返回
if(list1 == nullptr)
{
lastNode->next = list2;
return head;
}
else if(list2 == nullptr)
{
lastNode->next = list1;
return head;
}
//合并链表
if(list1->val < list2->val)
{
lastNode->next = list1;
list1 = list1->next;
}
else
{
lastNode->next = list2;
list2 = list2->next;
}
lastNode = lastNode->next;
}
}
};
时空复杂度
- 用时:4 ms, 在所有 C 提交中击败了92.95%的用户
- 内存:14.4 MB, 在所有 C 提交中击败了37.51%的用户
中途错误记录
- 没有对输入参数是空指针的情况进行特殊处理
if(list1 == nullptr)
return list2;
else if(list2 == nullptr)
return list1;
方法2:递归方法
主要思路
将大问题拆分成一个子问题:归并两个大链表,就是让两个大链表中比较小的头部next指向剩余链表节点的归并结果即listMinHead->next = fun(listMinHead->next, listMaxHead),其中listMinHead是当前两个链表头部数据比较小的节点,listMaxHead是当前两个链表头部数据比较大的节点。
源代码
//此代码来自leetcode评论:https://leetcode-cn.com/problems/merge-two-sorted-lists/comments/51102
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) {
if(l1==NULL)
return l2;
if(l2==NULL)
return l1;
if(l1->val < l2->val){
l1->next = mergeTwoLists(l1->next,l2);
return l1;
}else{
l2->next = mergeTwoLists(l1,l2->next);
return l2;
}
}