合并两个排序的列表
题目描述
输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。
数据范围
链表长度 [0,500][0,500]。
样例
输入:1->3->5 , 2->4->5
输出:1->2->3->4->5->5
代码实现
迭代版本
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
public:
ListNode* merge(ListNode* l1, ListNode* l2) {
ListNode *dummy = new ListNode(0);
ListNode *cur = dummy;
while (l1 != NULL && l2 != NULL) {
if (l1 -> val < l2 -> val) {
cur -> next = l1;
l1 = l1 -> next;
}
else {
cur -> next = l2;
l2 = l2 -> next;
}
cur = cur -> next;
}
cur -> next = (l1 != NULL ? l1 : l2);
return dummy -> next;
}
};
递归版本
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
public :
ListNode* merge(ListNode* l1, ListNode* l2) {
if(!l1 || !l2) return (l1 != NULL ? l1 : l2);
if(l1->val < l2->val) {
l1->next = merge(l1->next, l2);
return l1;
}
else{
l2->next = merge(l1, l2->next);
return l2;
}
}
};
点评
-
迭代版本是新建了一个list。可以重点看看
dummy
节点的使用。还有一个亮点是cur -> next = (l1 != NULL ? l1 : l2);
这样子就比较简洁。自己在迭代版本也使用了相同的技巧。 -
迭代版本的处理比较新颖。自己的递归基没有想错,但是迭代的处理想错了。其实是对第一个节点讨论。