合并两个有序链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
输入:l1 = [1,2,4], l2 = [1,3,4] 输出:[1,1,2,3,4,4]
解法一:迭代
合并前:
合并后:
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
//不排除其中有一条链是空链的可能,这时返回另一条
if (nullptr == l1)
return l2;
if (nullptr == l2)
return l1;
ListNode head(-1);
ListNode* phead = &head;
while (nullptr != l1 && nullptr != l2) {
if (l1->val > l2->val) {
//phead->next取较小者
phead->next = l2;
l2 = l2->next;
}
else {
phead->next = l1;
l1 = l1->next;
}
phead = phead->next;
}
//接上还未排完的
phead->next = l1 == nullptr ? l2 : l1;
return head.next;
}
};
解法二:递归
每次递归都使当前较小值,指向下一个较小值,递归返回时,返回该最小值的节点。
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if (nullptr == l1)
return l2;
if (nullptr == l2)
return l1;
if (l1->val > l2->val) {
//l2小,所以l1和l2->next比较,填的是l1和l2->next
l2->next = mergeTwoLists(l1, l2->next);
return l2;
}
l1->next = mergeTwoLists(l1->next, l2);
return l1;
}
};