刷代码随想录08 回溯+链表

 组合

77. 组合 - 力扣(LeetCode)

其实有点蒙,二维数组,如何行数不定,列数固定

这里创建了vector<vector<int>>以及vector<int>,利用.push_back(),pop_back()

class Solution {
private:
     vector<vector<int>> result;
     vector<int> path;
public:
    void back(int k,int start, int n){//如何标记已经遍历过的?--是按顺序的,不用考虑标记
        if(path.size() == k){
            result.push_back(path);
            return;
        }
        // for(int i = 1;i<=n-path.size();i++){//树的横向遍历,path.size()=0,i->4
        for(int i = start;i<=n;i++){
            path.push_back(i);
            back(k,i+1,n);//start+1 VS i+1
            path.pop_back();
        }
    }
    vector<vector<int>> combine(int n, int k) {
        back(k,1,n);
        return result;

    }
};

链表相交(23min)

面试题 02.07. 链表相交 - 力扣(LeetCode)

法一:暴力循环

这个是题目会自己定那个指针开始相交,所以是判断指针相等,简单的方法是两个while循环遍历。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {//p==q
        ListNode *p = headA;
        ListNode*q = headB;
        while(p != nullptr){
            while(q!=nullptr){
                if(p == q){
                    return q;
                }else{
                    q= q->next;
                }
            }
            q = headB;
            p = p->next;
        }
        return nullptr;
        
    }
};

法二:O(n)解法【类似于删除链表倒数第n个元素】 

看了代码随想录提示,

思路:假如两个链表相交长度是a,一个长m+a,一个长n+a

相当于将长的那个指针从头指针向右移|m-n|个单位,后面就一般长了,就可以一起移动指针,直到p==q;

错误总结:for的起止;while的终止条件;if写了else没写,先写结构整体试试

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {//p==q
        ListNode *dummyheadA = new ListNode(0);
        ListNode*dummyheadB = new ListNode(0);
        ListNode *p = dummyheadA;
        ListNode*q = dummyheadB;
        dummyheadA->next = headA;
        dummyheadB->next = headB;
        int asize = 0,bsize = 0;
        while(p->next!=nullptr){
            p = p->next;
            asize++;
        }
        while(q->next!=nullptr){
            q = q->next;
            bsize++;
        }
        if(asize<bsize){//要让长的是p
            p = dummyheadB;
            q= dummyheadA;
            int csize = asize;
            asize = bsize;
            bsize = csize;
        }else{//忘了
            p = dummyheadA;
            q = dummyheadB;
        }
        
        for(int i = 1;i<=asize-bsize;i++){//i应该从1到asize-bsize
            p = p->next;
        }
        while(p!=nullptr){//p->next!=nullptr([1],[1]测试用例没过)
            if(p==q){
                return p;
            }
            p = p->next;
            q= q->next;
        }
        return nullptr;
    }

};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值