单链表中的递归算法
目录
1.合并两个有序链表
2.反转链表
3.两两交换链表中的结点
1.合并两个有序链表
题目描述:
题目分析:
- 大问题:合并两个升序链表
- 策略:选出最小的结点,将剩下的部分和另一个链表拼接
- 子问题:合并剩下的部分和另一个升序链表
- 策略:选出最小的结点,将剩下的部分和另一个链表拼接
解决问题:
- 递归函数:ListNode* dfs(ListNode* list1, ListNode* list2);
- 函数功能:拼接两个升序链表。
题目链接:21. 合并两个有序链表 - 力扣(LeetCode)
代码示例:
class Solution {
public:
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
return dfs(list1, list2);
}
ListNode* dfs(ListNode* list1, ListNode* list2)
{
if(!list1) return list2;
if(!list2) return list1;
ListNode* ret = nullptr;
if(list1->val <= list2->val)
{
ret = list1;
ret->next = dfs(list1->next,list2);
}
else
{
ret = list2;
ret->next = dfs(list2->next,list1);
}
return ret;
}
};
2.反转链表
题目描述:
题目分析:
- 大问题:逆置n个节点的单链表
- 策略:逆置后面的n-1个节点,然后再和第一个逆置
- 子问题:逆置后面的n-1个节点
- 策略:逆置后面的n-2个节点,然后再和第二个逆置
解决问题:
- 递归函数:ListNode* dfs(ListNode* list)
- 功能:逆置list链表,并返回逆置之后最后一个结点的指针。
题目链接:206. 反转链表 - 力扣(LeetCode)
代码示例:
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if(!head)
return nullptr;
return dfs(head);
}
// 逆置单链表
ListNode* dfs(ListNode* list)
{
if(list->next == nullptr)
{
return list;
}
ListNode* ret = dfs(list->next);
list->next->next = list;
list->next = nullptr;
return ret;
}
};
3.两两交换链表中的结点
题目描述:
题目分析:
- 大问题:两两交换整个链表
- 策略:除了前两个结点,两两交换剩余的节点
- 子问题:两两交换剩余的结点
- 策略:除了前两个结点,两两交换剩余的结点
解决问题:
- 递归函数:ListNode* dfs(ListNode* head);
- 功能:两两交换head链表中的结点
题目链接:https://leetcode.cn/problems/swap-nodes-in-pairs/
代码示例:
class Solution {
public:
ListNode* swapPairs(ListNode* head)
{
return dfs(head);
}
ListNode* dfs(ListNode* head)
{
if(!head || !head->next)
{
return head;
}
ListNode* tmp = dfs(head->next->next);
ListNode* ret = head->next; // 先保存一下要返回的节点
head->next->next = head;
head->next = tmp;
return ret;
}
};