基本的指针操作实现基本的merge。
基础中的基础,但是在代码结构上来说,我们仍应当追求更加优美且有效的写法。
以下是按照本人第一时间的正常思路进行编写的代码:
/**
* 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* head1 = l1;
ListNode* head2 = l2;
ListNode* ans = new ListNode();
ListNode* now = ans;
ListNode* last = NULL;
while(head1 != NULL && head2 != NULL){
int v;
if (head1->val < head2 ->val){
v = head1->val;
head1 = head1->next;
}
else {
v = head2->val;
head2 = head2->next;
}
*now = ListNode(v);
now->next = new ListNode();
last = now;
now = now->next;
}
while(head1 != NULL){
*now = ListNode(head1->val);
now->next = new ListNode();
last = now;
now = now->next;
head1 = head1->next;
}
while(head2 != NULL){
*now = ListNode(head2->val);
now->next = new ListNode();
last = now;
now = now->next;
head2 = head2->next;
}
if (last != NULL){
last->next = NULL;
delete now;
}
else
ans = NULL;
return ans;
}
};
由于我的出发点是在运算时不应当对l1与l2进行修改,因此与接下来要介绍的优美的写法相比较而言,多了许多额外的存储空间以及特殊判定,不过整体的结构是清晰明了的。
接下来的代码出自这里:
https://leetcode.com/problems/merge-two-sorted-lists/discuss/1001380/C++-Recursive-and-Iterative-Solution
他使用递归的方式,十分合理而有效地利用了所有的指针空间,完成了在空间复杂度以及编码复杂度上对上面代码的碾压..
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if(l1 == NULL){
return l2;
}
if(l2 == NULL){
return l1;
}
if(l1->val < l2->val){
l1->next = mergeTwoLists(l1->next, l2);
return l1;
}
else{
l2->next = mergeTwoLists(l1, l2->next);
return l2;
}
}
};
唯一的不足之处是对于原始数据的结构,即两个链表l1与l2进行了修改,但倘若实际应用中没有影响的话,这段代码可谓是完美。
精益求精。 |