leetcode 21.合并两个有序链表 C++
思路:
- 顺序遍历,并逐个比较两个链表结点,
- 将值小的链表结点添加到结果链表尾部,指针后移继续遍历;
- 重复上述比较和添加操作,直至其中一个链表遍历结束;
- 将未遍历完的链表直接添加到结果链表尾部;
代码:
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if(l1==nullptr) return l2;
if(l2==nullptr) return l1;
ListNode* head=new ListNode(-1);
ListNode* rear=head;
while(l1!=nullptr && l2!=nullptr){
if(l1->val < l2->val){
rear->next=l1;
l1=l1->next;
}else{
rear->next=l2;
l2=l2->next;
}
rear=rear->next;
}
if(l1==nullptr) rear->next=l2;
else rear->next=l1;
return head->next;
}
};
复杂度:
- 时间复杂度: O ( n + m ) O(n+m) O(n+m) 即遍历次数不超过两个链表长度之和。
- 空间复杂度: O ( 1 ) O(1) O(1) 不需要开辟额外的空间。