题:
有两个排好序的int数组A、B;A数组有效长度m;B数组有效长度n;
假设A数组可以容纳B数组的所有元素,
试着把B数组合并到A数组形成一个新的排好序的数组。
// 时间复杂度O(m+n),空间复杂度O(1)
void mergeTwoSortedIntegerArrays(int A[], int m, int B[], int n) {
int i = m - 1, j = n - 1, k = m + n - 1;
while (i >= 0 && j >= 0) {
A[k--] = A[i] >= B[j] ? A[i--] : B[j--];
}
while (j >= 0) {
A[k--] = B[j--];
}
}
从后向前遍历,谁大存谁,
如果A数组先遍历完毕,顺序存下B数组剩下的所有元素
如果B数组先遍历完毕,A数组剩下的所有元素已经存好
题:
有两个排好序的链表A、B;合成一个排好序的链表C
ListNode *mergeTwoSortedLinkLists(ListNode *l1, ListNode *l2) {
if (l1 == nullptr) return l2;
if (l2 == nullptr) return l1;
ListNode rootNode(-1);
ListNode *p = &rootNode;
for (; l1 != nullptr && l2 != nullptr; p = p->next) {
if (l1->val > l2->val) {
p->next = l2; l2 = l2->next;
} else {
p->next = l1; l1 = l1->next;
}
}
p->next = l1 != nullptr ? l1 : l2;
return rootNode.next;
}
从前向后遍历,谁小存谁,
如果A链表先遍历完毕,挂B链表
如果B链表先遍历完毕,挂A链表