--------------------------二刷2020/12/25-----------------------------------
这段时间好像确实练习了之后比之前进步了,第一次做的时候中间部分写得有点烂
if(l1 ->val >= l2->val) {
tmp -> next = l2;
l2 = l2 -> next;
}
if(l2 && l1->val < l2->val ) {
//也可以用else
//一定要记得判断l2是否是空节点,否则l2->val会报错
tmp -> next = l1;
l1 = l1 -> next;
}
这里就不应该再去用if,因为l2已经往后移动了,用if逻辑比较混乱,并且还要多判断一次l2是否为空,
修改了一下就像现在这样
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if(!l1) return l2;
if(!l2) return l1;
ListNode * head = new ListNode(0);
ListNode * tmp = head;
while(l1 && l2) {
if(l1 -> val <= l2 -> val) {
tmp -> next = l1;
l1 = l1 ->next;
tmp = tmp -> next;
continue;
}
tmp -> next = l2;
l2 = l2 -> next;
tmp = tmp -> next;
}
if(l2) tmp -> next = l2;
else tmp -> next = l1;
return head->next;
}
};
---------------------------一刷-------------------------------------------------
题目描述
解法 逐个插入法
由于两个链表都是递增的,只需要在链表里依次往下查找,将next不断指向比较小的数字所在的节点即可。
当时老师也布置过这题,当年菜到这题都做了好久 = =,更没有想到什么鲁棒性和特殊情况,看来还是变强了。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode *head=NULL;
if(l1 == NULL) return l2;
if(l2 == NULL) return l1;
//没有下面这一段的话,tmp=NULL,tmp->next是非法的
if(l1 ->val >= l2->val) {
head = l2;
l2 = l2 -> next;
}
else {
head = l1;
l1 = l1 -> next;
}
ListNode* tmp = head;//用来往下指的指针
while(l1 && l2) {
if(l1 ->val >= l2->val) {
tmp -> next = l2;
l2 = l2 -> next;
}
if(l2 && l1->val < l2->val ) {
//也可以用else
//一定要记得判断l2是否是空节点,否则l2->val会报错
tmp -> next = l1;
l1 = l1 -> next;
}
tmp = tmp ->next;
}
if(l2 != NULL) tmp -> next = l2;
else tmp -> next = l1;
return head;
}
};
改进
觉得前面通过判断L1和L2大小来选定头节点,从而赋值给tmp指针在逻辑上面是冗余的。
然后就想到如果tmp不是NULL,而是Listnode类型的节点的话tmp->next不会报错。
自然而然就想到定义一个Listnode类型的假节点 伪头节点。
于是代码就看起来精简多了。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode *head=new ListNode(0);
if(l1 == NULL) return l2;
if(l2 == NULL) return l1;
ListNode* tmp = head;
while(l1 && l2) {
if(l1 ->val >= l2->val) {
tmp -> next = l2;
l2 = l2 -> next;
tmp = tmp -> next;
}
if(l2 && l1->val < l2->val) {
tmp -> next = l1;
l1 = l1 -> next;
tmp = tmp -> next;
}
}
if(l2 != NULL) tmp -> next = l2;
else tmp -> next = l1;
return head->next;
}
};
时间复杂度O(M+N),空间复杂度O(1)