1. 题目解析
题目链接:21. 合并两个有序链表
这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了。
2.算法原理
1. 递归函数定义与功能
递归函数的主要任务是将两个有序链表合并成一个新的有序链表,并返回合并后链表的头结点。递归的核心思想是将问题分解为更小的子问题,并递归地解决这些子问题,直到达到基本情况。在这个算法中,基本情况就是当其中一个链表为空时,直接返回另一个链表。
2. 函数体实现步骤
函数体的实现遵循以下步骤:
- 比较头结点:比较两个链表的头结点值,选择较小值的头结点作为合并后链表的当前头结点。
- 递归处理剩余部分:将剩余部分的链表(即去掉头结点后的链表)作为递归函数的输入,继续执行合并操作。递归调用会返回合并后剩余部分的头结点。
- 链接当前头结点和剩余部分:将当前头结点的指针指向递归调用返回的剩余部分的头结点,完成合并操作。
3. 递归退出条件
递归的退出条件是当其中一个链表为空时。这是因为当某个链表为空时,另一个链表已经是有序的,所以直接将非空链表作为合并后的链表返回即可。
4. 注意事项
- 链表操作需谨慎:链表操作涉及到指针的修改,需要格外小心。务必确保在修改指针之前,已经正确保存了需要使用的信息,避免链表断裂或丢失节点。
- 画图辅助理解:对于链表问题,画图是一种非常有效的辅助理解方式。通过画图可以清晰地看到链表的结构和指针的指向,有助于正确实现算法。
3.代码编写
/**
* 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;
if(l2 == nullptr) return l1;
if(l1->val <= l2->val)
{
l1->next = mergeTwoLists(l1->next, l2);
return l1;
}
else
{
l2->next = mergeTwoLists(l1, l2->next);
return l2;
}
}
};
The Last
嗯,就是这样啦,文章到这里就结束啦,真心感谢你花时间来读。
觉得有点收获的话,不妨给我点个赞吧!
如果发现文章有啥漏洞或错误的地方,欢迎私信我或者在评论里提醒一声~