1.递归,这个是官方大大的题解方法,说实话,本蒟蒻递归没怎么学明白;但是我把我能理解的都写上了注释,方便以后在回来看看,初学算法,没有老师教,只能自己一点点琢磨;
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
if(list1==nullptr)
return list2;
else if(list2==nullptr)
return list1;//上面两种情况,大家都能想到
else if(list1->val<list2->val)
{
list1->next=mergeTwoLists(list1->next,list2);
return list1;//如果list1中的一个节点的val值较小,那么可以以list1为“主板”,把list2拆开套在list1里面
}
else {
list2->next=mergeTwoLists(list1,list2->next);
return list2;//相反就要往list2里面套了~~
}
}
};
2.迭代(就是“3=1+2”式)
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
ListNode* p=new ListNode(-1);//相当于创建了一个空链表,next为null
//接下来就开始模拟加法运算
ListNode* ans=p;//定义指针变量,并以他来模拟运算
while(list1!=nullptr&&list2!=nullptr)//这个地方一定要是且,因为如果其中一个链表到了最后那么访问他的next就是非法的,一定要截到最先停下的一个链表
{
if(list1->val>list2->val)
{ans->next=list2; list2=list2->next;}
else
{ans->next=list1;list1=list1->next;}
ans=ans->next;
}
//注意这个时候的p为p->next,这时候list1或者list2中还剩余一个值,要再加在p的末尾
ans->next=list1==nullptr?list2:list1;
return p->next;//除去哑结点;
}
};
记录当下,我的编程之路