王道2_2_24
题目大意给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。
说明:不允许修改给定的链表。
。
思路
快慢两个指针,fast走两步,slow走一步,如果相遇就是有环
假设head与入幻点相差a,入环与slow差b,fast比slow多走a+b(2倍关系),若slow再走a会到入幻点(因为入幻与slow差b),而且head走a也是入幻点,所以如果a=slow,那么就是入幻点
代码实现12345678910111213141516171819202122//快慢指针,若相遇择优换 ListNode *fast=head,*slow=head; int flag=0; while(slow&&fast->next){ //fast走两次,所以需要检查fast的下一个 slow=slow-> ...
王道2_2_25
题目大意
给定一个单链表 L:L0→L1→…→Ln-1→Ln , 将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→…
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
思路
先找到中间节点,q用两次next,p用一次next,等q为空,那么p就是中间节点
对p后面的节点进行头插法,形成逆序,如123456,变成123465,*注意是465*
然后进行断链,形成1234和65两条链
最后进行和链162534
代码实现12345678910111213141516171819202122232425262728void reorderList(ListNode* head) { ListNode* p=head,*q=head,*r,*s=head; if(!head) //head为空,则直接退出 return ; while(q->next){ //寻找中间结点 q=q->next ...
王道2_2_21
题目大意实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。
思路双指针,第一个p先走k部,然后q从head开始,pq同时走,直到p为空,q就是索要的节点
设p与结尾查x次,总长k+x次,p走了x次,也就是倒数k
代码实现12345678910111213int kthToLast(ListNode* head, int k) { ListNode* c=head; while(k){ head=head.next; k--; } while(head){ c=c.next; head=head.next; } return c.val; }
王道2_2_6
题目大意给定一个头结点链表,按照从小到大排序
思路根据插入排序的思路和逆置链表的思路,首先先把头结点和他的next摘出p,让p为读取元链表的节点,pre为摘出来新链表的头结点,然后pre遍历,小于p.val的就继续,不然就是正常的插入。
代码实现12345678910111213141516171819202122232425262728293031struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {}}; //本题思路插入排序,头插法类似,吧l取出,做个新链表class Solution {public: void deleteNode(ListNode* node) { ListNode *p=node.next,*q=p.next; //pre是断链后端头插法节点 ListNode *pre; //进行断链 p.nex ...
a1009
a1009题目大意多项式乘法。
解决方法与前面的多项式加法基本类似。不过要构建两个双精度数组。第一个保存第一列的数字系数和指数。然后再还有一个哈希表。这个是保存第一列由哪几个数字是要进行指数相加的。第二列就首先是遍历这个哈希表。然后进行赋值。如果bi不是零,那么次数就加一。经过加法后,如果bi的值为0,那么次数就减一。,然后再次利用sort函数进行倒序输出就可以了。
代码123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263#include <iostream>#include <vector>#include <algorithm>#include <cstring>#include <cstdio>#include <map>#include <cmath>#include <set>#include < ...
a1008
a1008题目大意求错电梯所需要花费的所有时间。
代码123456789101112131415161718192021222324252627282930313233343536#include <iostream>#include <vector>#include <algorithm>#include <cstring>#include <cstdio>#include <map>#include <cmath>#include <set>#include <stack>#include <queue>//cin用多了超市using namespace std;const int maxn=100100;int main() { int n; cin>>n ; int cost[n]; for (int i = 0; i < n; ++i) { scanf("%d", ...
a1007
a1007题目大意给出序列片段最大的和。
解决方法使用动态规划,
第一步构建d[p]初始值1d[0]=cost[0];
第二步检查是不是所有的都是负数如果是,那么直接返回0
1234567891011int flag=0; for (int j = 0; j < n; ++j) { if (cost[j]>=0){ flag= 1; } } if (flag==0){// printf("0 %d %d",cost[0],cost[n-1]); return 0; }
写出转移态方程如果d[j-1]+a[j]>a[j],d[j]=d[j-1]+a[j],否则d[j]=a[j]
123456789101112for (int k = 1; k < n; ++k) { if (d[k-1]+cost[k]>cost[k]){ ...
a1006
a1006题目大意给出最早走了和最迟走的人。
解决方法通过把时间转化为秒,然后再利用sought函数进行排序。就可以给出答案。
代码1234567891011121314151617181920212223242526272829303132333435363738394041424344454647#include <iostream>#include <vector>#include <algorithm>#include <cstring>#include <cstdio>#include <map>#include <cmath>#include <set>#include <stack>#include <queue>//cin用多了超市using namespace std;const int maxn=100100;struct node{ string name; int start; int end;}stu[ ...
a1005
a1005题目大意给出一个数,把它的和加起来。然后再用英语来表达出他的和。
解决方法通过字符串来进行加减,然后再利用哈希表来进行查值输出。
代码1234567891011121314151617181920212223242526272829303132333435#include <iostream>#include <vector>#include <algorithm>#include <cstring>#include <cstdio>#include <map>#include <cmath>#include <set>#include <stack>#include <queue>//cin用多了超市using namespace std;const int maxn=100100;int main() { string string1; cin>>string1; int ans=0; for (int i ...