LeetCode:21 合并两个有序链表 递归解法
题目描述
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
思路
很容易想到【归并排序】
归并排序也是合并两个有序的序列,不过一般是用迭代法,这里合并链表,使用递归:
一趟递归分析
假设有有序序列[1, 2, 3]
和[2, 3, 4, 5]
,归并的开始,指针指向两个链表的头,即1, 2
- 比较指针位置的元素大小,显然1<2,1排在2前面
- 问题转换为:合并有序序列
[2, 3]
和[2, 3, 4, 5]
- 令
1
的next
指向【[2, 3]
和[2, 3, 4, 5]
合并后的头节点】即可 - 递归的边界:l1,l2任意一个节点为空,直接返回另一个
代码实现
/**
* Definition for singly-linked list.
* struct ListNode
* {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution
{
public:
/*
param l1 : 链表1头节点
param l2 : 链表2头节点
return : 归并l1,l2后的链表的头节点
*/
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2)
{
if(l1 && l2)
{
if(l1->val < l2->val)
{
l1->next = mergeTwoLists(l1->next, l2);
return l1;
}
else
{
l2->next = mergeTwoLists(l1, l2->next);
return l2;
}
}
else if(l1 && l2==NULL)
{
return l1;
}
else if(l1==NULL && l2)
{
return l2;
}
return NULL;
}
};