【LeetCode】21. 合并两个有序链表
题目
输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。
示例1:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
限制:0 <= 链表长度 <= 1000
思路一:迭代
添加一个虚拟节点处理头结点。
代码
时间复杂度:O(m + n)
空间复杂度:O(1)
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if (!l1 || !l2) return l1 ? l1 : l2;
ListNode *newHead = new ListNode(-1), *pre = newHead;
while (l1 && l2) {
if (l1->val <= l2->val) {
pre->next = l1;
l1 = l1->next;
} else {
pre->next = l2;
l2 = l2->next;
}
pre = pre->next;
}
pre->next = l1 ? l1 : l2;
return newHead->next;
}
};
思路二:递归
代码
时间复杂度:O(m + n)
空间复杂度:O(1)
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if (!l1 || !l2) return l1 ? l1 : l2;
ListNode *newHead = nullptr;
if (l1->val <= l2->val) {
newHead = l1;
newHead->next = mergeTwoLists(l1->next, l2);
} else {
newHead = l2;
newHead->next = mergeTwoLists(l1, l2->next);
}
return newHead;
}
};