LeetCode究極班系列(21-25)

可樂大牛發表於2020-10-05

21. 合併兩個有序連結串列

將兩個升序連結串列合併為一個新的 升序 連結串列並返回。新連結串列是通過拼接給定的兩個連結串列的所有節點組成的。

輸入:1->2->4, 1->3->4
輸出:1->1->2->3->4->4

遞迴

class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        if(l1==nullptr) return l2;
        if(l2==nullptr) return l1;
        if(l1->val<=l2->val){
            l1->next=mergeTwoLists(l1->next,l2);
            return l1;
        }
        l2->next=mergeTwoLists(l1,l2->next);
        return l2;
    }
};

迭代

class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        auto res=new ListNode(-1),tmp=res;
        while(l1 && l2){
            if(l1->val<l2->val){
                tmp->next=l1;
                l1=l1->next;
            }else{
                tmp->next=l2;
                l2=l2->next;
            }
            tmp=tmp->next;
        }
        if(l1) tmp->next=l1;
        if(l2) tmp->next=l2;
        return res->next;
    }
};

22. 括號生成

數字 n 代表生成括號的對數,請你設計一個函式,用於能夠生成所有可能的並且 有效的 括號組合。

輸入:n = 3
輸出:[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]

dfs

分析 括號匹配問題的兩個準則
1 在任意字首中 做括號的數目嚴格大於右括號
2 左括號數目和有哦括號數目相同

class Solution {
public:
    vector<string> res;
    void dfs(int n,int lc,int rc,string path){
        if(lc==n && rc==n) res.push_back(path);
        else{
            if(lc<n) dfs(n,lc+1,rc,path+"(");
            if(rc<n && lc>rc) dfs(n,lc,rc+1,path+")");
        }
    }
    vector<string> generateParenthesis(int n) {
        dfs(n,0,0,"");
        return res;
    }
};

相關文章