一开始拿到的时候想用双指针,想原地修改来着然后发现好像不行,需要【双指针遍历】+【新开头节点】
方法一:迭代【双指针遍历】+【新开头节点】
新开一个链表dum,用cur指针表示当前节点。如果list1的val小于list2的val,就添加list1到dum,注意cur和list1都要向后一个位置。
最后返回dum->next(dum相当于头节点,题解里也叫哨兵节点,值是空的,这里是数据结构里的知识吧)
class Solution {
public:
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
ListNode *dum=new ListNode(0);
ListNode *cur=dum;
while(list1!=nullptr && list2!=nullptr)
{
if(list1->val<list2->val)
{
cur->next=list1;
list1=list1->next;
}
else
{
cur->next=list2;
list2=list2->next;
}
cur=cur->next; //第一次写的时候漏了这个
}
cur->next = list1 == nullptr ? list2:list1;
return dum->next;
}
};
方法二:
去看题解发现竟然可以用【递归】!我对递归完全属于能看懂但写不出来的水平hh
1、出界条件:list1或list2为null
2、当前函数作用:合并两个链表
class Solution {
public:
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
if(list1==nullptr&&list2==nullptr)
return nullptr;
else if(list1==nullptr)
return list2;
else if(list2==nullptr)
return list1;
if(list1->val<=list2->val)
{
list1->next=mergeTwoLists(list1->next,list2);
return list1;
}
list2->next=mergeTwoLists(list1,list2->next);
return list2;
}
};
总结:加强对递归调用的理解吧,希望下次自己能写出来。