幼儿饰品瑜伽美体用品美文
快百科
美文创意
爱情通信
用品婚姻
爱好看病
美体软件
影音星座
瑜伽周边
星座办公
饰品塑形
搞笑减肥
幼儿两性
智家潮品

数据结构与算法链表

3月7日 相思宫投稿
  链表
  关于单链表,比较特殊,在面试中,要时刻注意时间复杂度和额外空间复杂度的问题
  所以在笔试中,额外空间的应用无所谓,能做到即可,可以使用数组作为额外空间来使用
  而在面试中要注意把额外空间复杂度降到最小,所以用克隆的方式来代替额外空间
  这样子可以用不多的几个变量来确定关系,而位置的关系是通过克隆的位置关系来去确定的,这样的好处是让复杂度变低的同时还达到很好的效果桶排序
  基数排序:分别按照个十百为先分别排序,然后再往上排序,对于每一位都是已经排好序,虽然不用进行比较,但是花费的空间和时间比较多基本稳定
  在排完序之后还保持着排序前的基本序列,在班级中按照成绩排,相同的排序按照学号前后综合排序
  在小样本的时候采用一种排序方式,大样本的时候采用另一种,让整体复杂度减小哈希表
  无序的,但有序表的key是有序的
  增删改查的复杂度都是常数,但是这个常数可能比较大
  unordermap,unordertree
  快慢指针求回文
  也可以申请栈,将每个数遍历后都放进栈里面去,然后依次弹出,比较
  可以采用快慢指针的方式,但是将头结点的下一位做慢指针,可以解决奇数和偶数问题
  随机哈希表的设置
  设置一个哈希表,将每个数的next和rand都放进哈希表里,第一次遍历老链表就是放进哈希表,第二次是根据哈希表里的next和rand,设置新链表的next和rand
  直接插入克隆结点在当前结点后面,这样的话就不用在哈希表里设置next了,然后在遍历的时候设置一下边界,一对对遍历,存入rand即可,克隆节点的rand就是原本节点rand的克隆节点
  有环链表
  可以申请哈希表额外空间,记录每个遍历后的结点,第一次重复访问到的节点就就是环的开头
  快慢指针:一开始都在head,慢指针一次走一步,快指针一次走两步,会在环里相遇,相遇后,快指针回到head,快慢指针同时走,都走一步,最终会在环的开始节点相遇无环链表
  判断两条链表是否在同一地址,即最后节点是否相同,因为当两条单链表有相交时,相交部分一定是相同的,next指针是不会断的。
  判断最后节点相同时即可判断出他们相交
  让长链表先走x步,x为二者差值,然后二者同时走,一定会在相交节点相遇cur1n0?head1:head2谁长,谁的头是head1cur2cur1head1?head2:head1谁短,谁的头是cur2
  重定位长短
  如果是相同环,则把终止节点设置为俩链表入环节点,其余按照无环链表操作,如果不同环,从loop1开始,如果遇得到loop2,则是不同入环节点,返回谁都可以,但如果没有,则不相交
  合并k个已排序链表
  思路:多个指针,有限几个变量,采用merge方法,拆分出左右两组链表,然后进行合并,大化小step1:从链表数组的首和尾开始,每次划分从中间开始划分,划分成两半,得到左边n2n2n2个链表和右边n2n2n2个链表。step2:继续不断递归划分,直到每部分链表数为1。step3:将划分好的相邻两部分链表,按照两个有序链表合并的方式合并,合并好的两部分继续往上合并,直到最终合并成一个链表。classSolution{public:ListNodeMerge2(ListNodephead1,ListNodephead2){if(phead1NULL)returnphead2;if(phead2NULL)returnphead1;ListNodeheadnewListNode(0);ListNwhile(phead1phead2){if(phead1valphead2val){curnextphead2;phead2phead2}else{curnextphead1;phead1phead1}}if(phead1)curnextphead1;elsecurnextphead2;}ListNodepideMerge(vectorListNodelists,intleft,intright){if(leftright)returnNULL;elseif(leftright)returnlists〔left〕;intmid(leftright)2;returnMerge2(pideMerge(lists,left,mid),pideMerge(lists,mid1,right));}ListNodemergeKLists(vectorListNodelists){returnpideMerge(lists,0,lists。size()1);}};链表中环的入口节点可以采用哈希表,放进去的节点遇到重复的第一个就是入环节点快慢指针:快指针走两步,慢指针走一步,当快慢指针相遇时,快指针返回起点,快慢指针一起走,都是走一步,再次相遇的节点就是入环节点classSolution{public:ListNodeEntryNodeOfLoop(ListNodepHead){if(pHeadNULL)returnNULL;ListNodeslowpHListNodefastpHwhile(fast!NULLfastnext!NULL){if(slowfast)}if(fastNULLfastnextNULL)returnNULL;fastpHwhile(fast!slow){}}};链表中倒数最后k个结点两次遍历的方法,先统计总长,然后nk次遍历找到可以快慢指针,快指针先走k步,然后和慢指针一起走classSolution{public:ListNodeFindKthToTail(ListNodepHead,intk){writecodeherewhile(pHeadNULL)returnNULL;ListNodefastpHListNodeslowpHfor(inti0;i){if(fastNULL)returnNULL;}while(fast!NULL){}}};删除链表的倒数第n个结点classSolution{public:ListNoderemoveNthFromEnd(ListNodehead,intn){添加表ListNoderesnewListNode(1);当前节点ListN前序节点ListNListN快指针先行n步while(n)while(fast!NULL){}删除该位置的节点返回去掉头}};两个链表的第一个公共结点循环遍历两个链表,迟早会相遇publicListNodeFindFirstCommonNode(ListNodepHead1,ListNodepHead2){ListNodel1pHead1,l2pHead2;while(l1!l2){l1(l1null)?pHead2:l1。l2(l2null)?pHead1:l2。}returnl1;}额外空间的,所有都存进去,看是否有相同的双指针,先走差值步,然后同时遍历,第一个相同的就是公共结点
  链表相加采用反转链表的方式classSolution{public:ListNodereverselist(ListNodephead){if(pheadNULL)ListNListNodepreNULL;while(cur!NULL){ListN}}ListNodeaddInList(ListNodehead1,ListNodehead2){writecodehereif(head1NULL)returnhead2;if(head2NULL)returnhead1;head1reverselist(head1);head2reverselist(head2);ListNoderesnewListNode(1);ListNintcarry0;while(head1!NULLhead2!NULLcarry!0){intval1head1NULL?0:head1intval2head2NULL?0:head2inttempval1val2carrytemp10;temp10;headnextnewListNode(temp);if(head1!NULL){head1head1}if(head2!NULL){head2head2}}returnreverselist(resnext);}};采用辅助空间的方式publicclassSolution{publicListNodeaddInList(ListNodehead1,ListNodehead2){writecodehereif(head1null)returnhead2;if(head2null){returnhead1;}使用两个辅助栈,利用栈先进后出,相当于反转了链表StackListNodestack1newStack();StackListNodestack2newStack();ListNodep1head1;ListNodep2head2;将两个链表的结点入栈while(p1!null){stack1。push(p1);p1p1。}while(p2!null){stack2。push(p2);p2p2。}进位inttmp0;创建新的链表头节点ListNodeheadnewListNode(1);ListNodenHeadhead。while(!stack1。isEmpty()!stack2。isEmpty()){val用来累加此时的数值(加数加数上一位的进位当前总的数值)栈1不为空的时候,弹出结点并累加值if(!stack1。isEmpty()){valstack1。pop()。}栈2不为空的时候,弹出结点并累加值if(!stack2。isEmpty()){valstack2。pop()。}求出进位tmpval10;进位后剩下的数值即为当前节点的数值ListNodenodenewListNode(val10);将结点插在头部node。nextnHnH}if(tmp0){头插ListNodenodenewListNode(tmp);node。nextnHnH}returnnH}}
  单链表的排序数组形式:创建一个数组,将链表内容放入,然后排序完恢复链表形式classSolution{public:ListNodesortInList(ListNodehead){ListN遍历链表,将节点值加入数组while(p!NULL){nums。pushback(pval);}对数组元素排序sort(nums。begin(),nums。end());遍历数组for(inti0;inums。size();i){将数组元素依次加入链表pvalnums〔i〕;}}};递归形式:每次分成两部分,然后将分割后的部分进行局部排序,最终达到整体有序classSolution{public:ListNodemergelist(ListNodephead1,ListNodephead2){if(phead1NULL)returnphead2;if(phead2NULL)returnphead1;ListNodeheadnewListNode(0);ListNwhile(phead1phead2){if(phead1valphead2val){curnextphead2;phead2phead2}else{curnextphead1;phead1phead1}}if(phead1)curnextphead1;elsecurnextphead2;}ListNodesortInList(ListNodehead){writecodehereif(headNULLheadnextNULL)ListNListNListNwhile(right!NULLrightnext!NULL){}左边指针指向左段的左右一个节点,从这里断开leftnextNULL;分成两段排序,合并排好序的两段returnmergelist(sortInList(head),sortInList(mid));}};
  判断链表是否为回文结构存入数组的方式,然后将数组反转后对比存入数组的方式,得到数组长度,双指针分别从两端开始classSolution{public:boolisPail(ListNodehead){将链表元素取出一次放入数组while(head!NULL){nums。pushback(headval);}双指针指向首尾intleft0;intrightnums。size()1;分别从首尾遍历,代表正序和逆序while(leftright){如果不一致就是不为回文if(nums〔left〕!nums〔right〕)}}};快慢指针方式,记录到中间位置,然后反转后半部分,再对比(满足时间O(n),空间O(1))classSolution{public:ListNodereverse(ListNodehead){ListNodepreNULL;while(head!NULL){ListN}}boolisPail(ListNodehead){writecodehereListNListNwhile(fastnext!NULLfastnextnext!NULL){}slowreverse(slow);while(slow!NULL){if(fastval!slowval)}}};
  链表的奇偶重排双指针的方式,将偶数的节点跳过,奇数的next直接指向下一个奇数,偶数则成为奇数的nextclassSolution{public:ListNodeoddEvenList(ListNodehead){writecodehereif(headNULL)returnNULL;ListNListNListNwhile(even!NULLevennext!NULL){}}};
  删除有序链表中重复的所有元素从0开始,不从1开始,这样的话可以从重复节点的上一个开始判断,每一次遇到重复前都可以判断出后面两个是否有重复元素classSolution{public:ListNodedeleteDuplicates(ListNodehead){writecodehereif(headNULL)returnNULL;ListNoderesnewListNode(0);ListNwhile(curnext!NULLcurnextnext!NULL){if(curnextvalcurnextnextval){while(curnext!NULLcurnextvaltemp){}}}}};
投诉 评论 转载

坐车坐腻了,乘船出海吧佳辰美景样样不缺身为海边的人有一个优势就是如果开车开腻了自驾游,实在没地方想去了,那么可以乘船出海。出海的玩法很多,相信大家也都有过了解。而山东省日照市就有一个帆船锦标赛基地,平时……499元起!4000mAh双系统,11复刻iPhone13虽然今天还没有到6月18日,但各家手机厂商已经早早地开始针对618活动进行不同程度的打折优惠。苹果这边也不例外,对于苹果粉丝来说,各平台的优惠可以说是无时无刻都在诱惑着大家,很……演员王茜华千里追夫,二婚和沈航生下儿女,她真的幸福吗?1996年,26岁的王茜华第一次接到导演姜文的邀约,出演《北方故事》的女主角,这对她来说是一个一炮而红的机会。然而等她兴冲冲赶到剧组体验完生活后,却被通知女主角换成了还在……没有穷人的卡塔尔豪掷2290亿建新城,要建造建筑与艺术的国际2022年世界杯已经开幕一周了,热度却在持续发酵。主办国卡塔尔这个人口不足300万,面积和我国天津一般大的国家,因为财富彻底出圈。虽说卡塔尔官方并未披露本届世界杯的……随遇而安(四十六)随遇而安(四十六)扪心自问不是多少喜欢足球,还是废寝忘食的几乎一场不漏的看着世界杯比赛。谁输谁赢并不是太在意,就看着赛场上的那些男人或哭或笑,或兴奋或痛苦,或激情飞扬或郁……1899元!影驰发布名人堂1300W白金电源理论显卡供电12近日,影驰发布了全新的名人堂GH1300电源,符合新的ATX3。0标准,而且采用了名人堂特色的纯白外观设计,象牙白喷粉。该电源通过80PLUS白金牌认证,主动式APFC,……乡村振兴恒天翼数字乡村智慧旅游综合管理平台信息化建设方案通过智慧旅游管理平台的建立,健全统一指挥、功能完善、反应灵敏、协调有序、运转高效的运行监测机制,有效监测旅游市场的运行状态,及时有效地整合旅游信息,为日常管理、辅助决策提供支撑……CBA下赛季最大黑马?深圳队18人名单全部确定,四位国手齐聚深圳队今年休赛期闷声发大财深圳队是今年休赛期引援最为成功的球队之一,从广东队得到了周鹏,签下了自由球员李京龙和赵宴满,从青年队上调了李文豪、王浩然、马明坤、廖智鹏。当然,……治疗痰湿耳鸣,三味药一通一补一消大有奇效耳鸣有三种原因:第一种是因虚而鸣。就像肚子饿了会咕咕响一样,肚子响是脾胃里面空虚了,耳朵也会响,耳朵响是肾精亏虚了,因为肾开窍于耳。第二种是因实而鸣。耳朵里头被气机……离谱!三国杀再出300字武将!不要以为有黑丝就可以一笔勾销了三国杀最近的活动可谓是不少,又是送满减券又是上新武将皮肤的,好家伙是真不让玩家休息啊,所以我最近也是一直在刷有什么新出的武将没有,还真让我找到了一个,只不过这技能把我头都看花了……数据结构与算法链表链表关于单链表,比较特殊,在面试中,要时刻注意时间复杂度和额外空间复杂度的问题所以在笔试中,额外空间的应用无所谓,能做到即可,可以使用数组作为额外空间来使用而……早晨问安问候是一种快乐,开心是一种幸福,早晨好1、阵阵微风,寄托一份相思;丝丝牵念,送去一片真情。人生中莫过于真诚的朋友,最难寻的,莫过于交心的知己!2、一直深信,不管时光如何变迁,内心的宁静,可以滋养山河岁月;内心……
单场11记三分,狂轰4162!拉文打疯了,哈登17投17分一贵阳人一大波端午假期文旅活动来袭聚焦超大规模数据中心施耐德电气助力运营商出海建设头顶摘瓜连得6分!巴特勒26854真够硬乔治又成背景板周鸿祎的退亏本卖掉欧朋浏览器,又要清仓腾讯音乐斯塔姆曼联没找我谈过,如果他们有需要我愿意帮忙2022年最值得玩的10款独立游戏!充满个性特色十足王者荣耀优秀辅助的开始四川13万张1元购门票怎么抢?攻略来了广西大学科研人员发现距地球最近的脉冲星风云中国女篮夺得世界杯亚军近一半阵容来自内蒙古农信女篮我是如何让客厅的影音设备换发青春的
当武术遇上惯性,用好了就是绝技,胡乱用就是笑柄北京民办小学入学条件基德保罗在控卫位置上已做到完美他各方面都强得离谱盆景那些事盆景的分类边缘特征界定及关羽温酒斩华雄虽然他登场次数很少,但却让人印象深刻,还差点将奥特曼变成怪兽 性,爱与征服儿童患肾结石有哪些症状花呗分期付款利息是多少(花呗分期付款退款了还有利息吗)热闻聚 痘痘肌肤保养的方法3年投入超46亿,击败顺丰和德邦,口碑第一的中国快递品牌易主年龄问题

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找漯河衢州兴义眉山桂林阳泉玉溪简阳山东遂宁永城新余梧州洛阳泸州温州临汾清远营口常熟浙江大连桐乡宜昌