题解一创建辅助头节点
图示:
复杂度分析:
时间复杂度:O(M+N)),最差为轮流插入两个链表,最终需要遍历完两个链表,所以为O(M+N))
空间复杂度:O(1),只使用了有限常数个变量;
实现如下:
class Solution {
public:
/**
*
* @param l1 ListNode类
* @param l2 ListNode类
* @return ListNode类
*/
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
// write code here
ListNode* t = new ListNode(0); //辅助头节点
ListNode* p =t;
while(l1 && l2){
if(l1->val > l2->val) {p->next = l2; l2 = l2->next;}
else {p->next = l1; l1 = l1->next;}
p = p->next;
}
//l1为空 直接在后面拼接l2
if(!l1) p->next = l2;
else p->next = l1;
return t->next;
}
};题解二: 不做辅助节点
先比较l1,l2头节点,确定用哪个作为新头,剩下的与题解一相同
复杂度分析:
时间复杂度:O(M+N),最差为轮流插入两个链表,最终需要遍历完两个链表,所以为O(M+N))
空间复杂度:O(1),只使用了有限常数个变量;
实现如下:
class Solution {
public:
/**
*
* @param l1 ListNode类
* @param l2 ListNode类
* @return ListNode类
*/
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
//有一个为空返回另一个
if(!l1) return l2;
if(!l2) return l1;
ListNode * p,*q,*head;
if(l1->val > l2->val) {head = l2;l2 = l1;} // 确定新头
else head = l1;
p = head->next;
q = head;
while(p && l2){
if(p->val > l2 ->val){q->next = l2;l2 = l2->next;}
else {q ->next = p;p = p->next;}
q = q->next;
}
//有一个为空,那么直接在后面拼接
if(p) q->next = p;
else q->next = l2;
return head;
}
};
京公网安备 11010502036488号