leetcode 21

递归的方式

class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
    
        if(l1 == nullptr){
            return l2;

        }else if(l2 == nullptr){
            return l1;

        }else if(l1->val < l2->val){
            l1->next = mergeTwoLists(l1->next, l2);
            return l1;

        }else if(l1->val > l2->val){
            l2->next = mergeTwoLists(l1, l2->next);
            return l2;
        }else{
            l2->next = mergeTwoLists(l1, l2->next);
            return l2;
        }
        
    }
};

leetcode 21_第1张图片
递归调用顺序是

m(1,1) -> m(1,3) -> m(2,3) -> m(4,3) ->m(4,4) -> m(4, nullptr)

比较特殊的是相等的情况;
这道题用递归做还是挺有创意的,一边递归,一边修改指针的内容;

迭代的方式

class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        ListNode* pre = new ListNode();

        ListNode* res = pre; 

        while(l1 !=nullptr && l2!= nullptr){
            if(l1->val < l2->val){
                pre->next = l1;
                l1 = l1->next;
            }else{
                pre->next = l2;
                l2 = l2->next;
            }
            pre = pre->next;
        }
        pre ->next = l1 == nullptr? l2:l1;

        return res->next;
        
    }
};

迭代的方式空间复杂度会比递归好

你可能感兴趣的:(leetcode,算法)