合并两个有序链表
普通方法
ListNode *mergeTwoLists(ListNode *&l1, ListNode *&l2) {
ListNode head(0), *temp = &head;
while (l1 != nullptr && l2 != nullptr) {
if (l1->val < l2->val) {
temp->next = l1;
l1 = l1->next;
} else {
temp->next = l2;
l2 = l2->next;
}
temp = temp->next;
}
if (l1 != nullptr)
temp->next = l1;
else if (l2 != nullptr)
temp->next = l2;
return head.next;
}
考虑这样一种情况,l1链表内容为(1,2,3,4,5),l2的内容为(6,7,8,9),在上述代码中,即使前五个数字都来自于l1,但是代码仍将执行 temp->next=l1 五次,浪费时间,可进一步优化
最优解
ListNode *mergeTwoLists(ListNode *l1, ListNode *l2) {
ListNode dummy(0);
dummy.next = l1;
ListNode *cur = &dummy;
while (l2) {
while (cur->next && cur->next->val <= l2->val)
cur = cur->next;
l1 = cur->next;
cur->next = l2;
l2 = l1;
}
return dummy.next;
}