原题
思路
最初简单的思路:比较两链表目前比较node的val,小的那个val就放到新节点里。
但是后来看了题解,发现这里我有一个很大的误区,不应该new ListNode,重新创node是完全没有必要的,而是应该指向已有的那个节点。(具体代码和性能见第二份)
官方题解有两种方法:递归和迭代。出于学习的目的,在学习实现的思想后我均进行理解和复现。
代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
void addNode(ListNode* &ans, ListNode* &l) {
ans->next = new ListNode(l->val);
l = l->next;
ans = ans->next;
return;
}
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode *ans = new ListNode(0);
ListNode *nowList = ans;
while (l1 && l2) {
if (l1->val <= l2->val) addNode(nowList, l1);
else addNode(nowList, l2);
}
while (l1) addNode(nowList, l1);
while (l2) addNode(nowList, l2);
return ans->next;
}
};
递归
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if (l1 == nullptr) return l2;
else if (l2 == nullptr) return l1;
else if (l1->val <= l2->val) {
l1->next = mergeTwoLists(l1->next, l2);
return l1;
}
else {
l2->next = mergeTwoLists(l2->next, l1);
return l2;
}
}
};
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode *preNode = new ListNode(-1);
ListNode *now = preNode;
while (l1 && l2) {
if (l1->val <= l2->val) {
now->next = l1;
l1 = l1->next;
}
else {
now->next = l2;
l2 = l2->next;
}
now = now->next;
}
now->next = (l1? l1: l2);
return preNode->next;
}
};
运行截图
递归
迭代
收获
节点如果不需要重新创,就不要重新创,可以减少不必要的内存和时间的浪费。