合并两个有序链表
题目要求将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
算法思路
使用递归处理这类问题非常直观。我们可以把合并操作看作是一个决策过程:
- 基准情况:如果其中一个链表为空,直接返回另一个链表的头结点。这是递归的终止条件。
- 递归步骤:比较两个链表当前头结点的值,选择较小的那个作为合并后链表的当前头结点。然后,将该结点的
next指针指向剩余部分的递归结果。 - 核心逻辑:每次递归调用都只关注'当前两个头结点谁小',剩下的交给下一次递归去解决。
注意:链表操作务必画图辅助理解,明确指针指向的变化,避免死循环或断链。
C++ 代码实现
class Solution {
public:
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
if (list1 == nullptr) return list2;
if (list2 == nullptr) return list1;
if (list1->val < list2->val) {
list1->next = mergeTwoLists(list1->next, list2);
return list1;
} else {
list2->next = mergeTwoLists(list2->next, list1);
return list2;
}
}
};
反转链表
给定单链表的头结点 head,请反转链表并返回新的头结点。
算法思路
递归反转链表是理解递归栈回溯的经典案例。
- 递归含义:函数接收一个头结点,返回以该结点为起点的反转后的新头结点。
- 终止条件:当链表为空或只剩一个结点时,它本身就是反转后的头结点,直接返回。
- 回溯过程:假设
reverseList(head->next)已经完成了后续部分的重排,返回了新的头结点newHead。此时,原head的下一个结点(即head->next)应该指向head本身,而head的next置空,防止形成环。
关键点在于理解递归调用返回后,指针是如何在栈帧中重新连接的。
C++ 代码实现
class {
:
{
(head == || head->next == ) head;
ListNode* newHead = (head->next);
head->next->next = head;
head->next = ;
newHead;
}
};


