审题
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
作为一个链表菜鸡,这道题卡了我一个多小时…原因主要是两个,希望大家避免。
1:链表传递指针后,要用一个新的指针去移动来遍历,否则外面的指针是也是会变得。
2:在C++中,用malloc不free是不可以的,至少在Leetcode里不行,因此,就老老实实用new就完事了。
至于这道题的思路,为了避免链表操作 (那我还刷什么链表题) 用vector保存所有元素,排序,一个一个加进去。很笨的方法。
代码实现
方案一(上文提到的方法):
/**
* 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 == NULL) return l2;
if (l2 == NULL) return l1;
ListNode* l = new ListNode;
ListNode* head = new ListNode;
l->next = nullptr;
head = l;
vector<int> v;
while(l1) {
v.push_back(l1->val);
cout << l1->val << endl;
l1 = l1->next;
}
while(l2) {
v.push_back(l2->val);
cout << l2->val << endl;
l2 = l2->next;
}
sort(v.begin(),v.end());
for ( int i=0; i<v.size(); i++ ) {
cout << i << endl;
if ( i==0 ) {
l->val = v[i];
} else {
ListNode* tmp = new ListNode;
tmp->val = v[i];
tmp->next = nullptr;
l->next = tmp;
l = l->next;
}
}
return head;
}
};
方案2:
然而在看完题解的递归思路之后,深感震撼,仿写一波,太牛了。
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if ( l1==nullptr ) return l2;
if ( l2==nullptr ) return l1;
if ( l1->val < l2->val ) {
l1->next = mergeTwoLists(l1->next, l2);
return l1;
} else {
l2->next = mergeTwoLists(l1, l2->next);
return l2;
}
}
};
反思
链表也能递归,这是之前没有想到过的,长见识了。