每日5题(2020/10/8)
给出两个链表如下所示: A: a1 → a2 ↘ c1 → c2 → c3 ↗ B: b1 → b2 → b3 输出第一个公共节点c1
两个链表的第一和节点
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *findFirstCommonNode(ListNode *headA, ListNode *headB) {
//方法一:双指针法
/* int lenA=0,lenB=0;
struct ListNode * p=headA;
struct ListNode * q=headB;
while(p){
p=p->next;
lenA++;
}
while(q){
q=q->next;
lenB++;
}
p=headA;q=headB;
if(lenA>lenB){
for(int i=0;i<lenA-lenB;i++){
p=p->next;
}
while(p){
if(p->val==q->val){return q;}
p=p->next;
q=q->next;
}
}else{
for(int i=0;i<lenB-lenA;i++){
q=q->next;
}
while(p){
if(p->val==q->val){return q;}
p=p->next;
q=q->next;
}
}
return NULL;
*/
//方式二:标记法
struct ListNode * flag=new ListNode(-1);
struct ListNode * p=headA;//遍历A链表,将所有的节点指向标记
while(p){
struct ListNode * tmp=p->next;
p->next=flag;
p=tmp;
}
struct ListNode * q=headB;
while(q){
if(q->next==flag){
return q;
}else{
q=q->next;
}
}
return NULL;
}
};
(2)
将一个骰子投掷n次,获得的总点数为s,s的可能范围为n~6n。
掷出某一点数,可能有多种掷法,例如投掷2次,掷出3点,共有[1,2],[2,1]两种掷法。
请求出投掷n次,掷出n~6n点分别有多少种掷法
class Solution {
public:
vector<int> numberOfDice(int n) {
//暴力搜索《dfs
//dfs(n,s)=dfs(n-1,s-1)+dfs(n-1,s-2)+dfs(n-1,s-3)+dfs(n-1,s-4)+dfs(n-1,s-5)+dfs(n-1,s-6)
/* vector<int>res;
for(int i=n;i<=6*n;i++){
res.push_back(dfs(n,i));
}
return res;*/
vector<int> res;
vector<vector<int> > f(n+1, vector<int> (n * 6+1));
f[0][0] = 1;
for(int i = 1; i <= n; i ++)
for(int j = i; j <= i * 6; j ++)
for(int k = 1; k <= min(j, 6); k ++)
f[i][j] += f[i - 1][j - k];
for(int i = n; i <= n * 6; i ++) res.push_back(f[n][i]);
return res;
}
/* int dfs(int n,int sum){
if(sum<0){return 0;}
if(!n){
return !sum;
}
int res=0;
for(int i=1;i<=6;i++){
res+=dfs(n-1,sum-i);
}
return res;
}*/
};

浙公网安备 33010602011771号