题意理解:
合并两个有序链表l1,l2,合并后的链表有序。
问题分析
设合并是函数f,那么合并后的链表l3 = f(l1,l2)。
l3 = f(l1,l2) = 当l1[0] < l2[0]时,l3 = l1[0] + f(l1[1:], l2);
其他, l3 = l2[0] + f(l1, l2[1:]).
递归式如上。
非递归情况:用了哑指针,和双指针法处理。
其他
https://leetcode-cn.com/problems/merge-two-sorted-lists/
算法之妙,存于一心。
数学语言描述,再用算法实现(一部分直接翻译,一部分考虑物理情况)
链接
递归解法:
/**
* 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) { //终止条件1
return l2;
}
if (l2 == nullptr) { //终止条件2
return l1;
}
if (l1 -> val < l2 -> val) { //递归式
l1 -> next = mergeTwoLists(l1 -> next, l2);
return l1;
}
else {
l2 -> next = mergeTwoLists(l1, l2 -> next);
return l2;
}
return nullptr;
}
};
非递归解法:
/**
* 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) {
ListNode* l3 = new ListNode(0); //哑指针,
ListNode* p3 = l3;
while(l1 != nullptr && l2 != nullptr) { //双指针后退
int l1_val = l1 -> val;
int l2_val = l2 -> val;
if (l1_val < l2_val) {
p3 -> next = l1;
l1 = l1 -> next;
}
else {
p3 -> next = l2;
l2 = l2 -> next;
}
p3 = p3 -> next;
}
if (l1 != nullptr) { //善后1
p3 -> next = l1;
}
if (l2 != nullptr) { //善后2
p3 -> next = l2;
}
return l3 -> next;
}
};