摘要: 思路1:先遍历第一个链表到他的尾部,然后将尾部的next指针指向第二个链表(尾部指针的next本来指向的是null)。这样两个链表就合成了一个链表,判断原来的两个链表是否相交也就转变成了判断新的链表是否有环的问题了:即判断单链表是否有环?思路2:如果他们相交的话,那么他们最后的一个节点一定是相同的,否则是不相交的。因此判断两个链表是否相交就很简单了,分别遍历到两个链表的尾部,然后判断他们是否相同,如果相同,则相交;否则不相交。判断出两个链表相交后就是判断他们的交点了。假设第一个链表长度为len1,第二个问len2,然后找出长度较长的,让长度较长的链表指针向后移动|len1 - len2|(le 阅读全文
posted @ 2013-11-25 15:50 alexeyqian 阅读(364) 评论(0) 推荐(0) 编辑
摘要: Method Oneint is_cycle_list(Node* head) { Node *temp, *current, *next; if(!head) return FALSE; temp = NULL; current = head; next = head->next; current->next = temp; while(next) { if(next == head) { return TRUE; } temp = c... 阅读全文
posted @ 2013-11-25 15:37 alexeyqian 阅读(174) 评论(0) 推荐(0) 编辑
摘要: #include #include typedef struct TNode { int value; TNode* lchild; TNode* rchild; }TNode,*BTree; //根据先序遍历、中序遍历构建二叉树 BTree rebuild(int preOrder[],int startPre,int endPre,int inOrder[],int startIn,int endIn) { //先序遍历和中序遍历长度应相... 阅读全文
posted @ 2013-11-21 15:59 alexeyqian 阅读(217) 评论(0) 推荐(0) 编辑
摘要: 有N个重量和价值分别为wi和vi的物品。从这些物品中挑选出总重量不超过W的物品,求所有挑选方案中价值总和的最大值。#define MAX_N 1000// inputint N, W, w[MAX_N], v[MAX_N];int dp[MAX_N][MAX_N]; // remember array to reduce recursiveint rec(int i, int weight){ if(dp[i][weight] >= 0) return dp[i][weight]; int ans; if(i == N) // no product left ... 阅读全文
posted @ 2013-11-08 15:06 alexeyqian 阅读(135) 评论(0) 推荐(0) 编辑
摘要: 有1元、5元、10元、50元、100元、500元的硬币各C1、C5、C10、C50、C100、C500枚。现在要用这些硬币来支付A元,最少需要多少枚硬币?假设至少存在一种支付方式。// Values of coinsconst int V[6] = {1, 5, 10, 50, 100, 500};// Inputint A, C[6];void solve(){ int ans = 0, i, t; for(i = 5; i >= 0; i--) { t = min(A/V[i], C[i]); A -= T*v[i]; ans +... 阅读全文
posted @ 2013-11-07 14:04 alexeyqian 阅读(328) 评论(0) 推荐(0) 编辑
摘要: 给定整数 a1, a2, a3, ..., an, 判断是否可以从中选出若干数,使他们的和恰好为k。1 <= n <= 20-10^8 <= ai <= 10^8-10^8 <= k <= 10^8int n, k, a[MAX_N];bool dfs(int i, int sum){ if(i == n) return sum == k; if(dfs(i+1, sum)) return true; if(dfs(i+1, sum + a[i])) return true; return false;}void solve(){ if(dfs(0,0)) 阅读全文
posted @ 2013-11-06 21:22 alexeyqian 阅读(169) 评论(0) 推荐(0) 编辑
摘要: 利用记忆数组减少重复计算int memo[MAX_N+1];int Fbi(int i){ if(i 0) return memo[i]; return memo[i] = Fbi(i-1) + Fbi(i-2);} 阅读全文
posted @ 2013-11-06 21:12 alexeyqian 阅读(175) 评论(0) 推荐(0) 编辑
摘要: Greated Common Divisorint GCD(int a, int b){ int temp; if(a < b) { temp = a; a = b; b = temp; } if(a % b == 0) return b; return GCD(b, a % b);}Least Common Multiple//最小公倍数等于两数之积除以最大公约数 int LCM(int a,int b){ return (a * b) / GCD(a, b); } 阅读全文
posted @ 2013-11-04 15:49 alexeyqian 阅读(169) 评论(0) 推荐(0) 编辑
摘要: include leap yearint dayOfYear(int year, int month, int day){ int months[13] = {0,31,30,28,31,30,31,31,30,31,30,31}, i, days = 0; if( (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) // is leap year months[2] = 29; for(i = 1; i < month; i++) days += months[i]; days ... 阅读全文
posted @ 2013-11-04 15:35 alexeyqian 阅读(222) 评论(0) 推荐(0) 编辑
摘要: string end with '#'void reversePrint(){ char c; scanf("%c", &c); if(c != '#') reversePrint(); if(c != '#') printf("%c", c);} 阅读全文
posted @ 2013-11-04 15:22 alexeyqian 阅读(749) 评论(1) 推荐(0) 编辑