三指针 | #删除链表中重复的结点#

删除链表中重复的结点

https://www.nowcoder.com/practice/fc533c45b73a41b0b44ccba763f866ef?tpId=265&tqId=39270&rp=1&ru=/exam/oj/ta&qru=/exam/oj/ta&sourceUrl=%2Fexam%2Foj%2Fta%3Fpage%3D1%26pageSize%3D50%26search%3D%26tpId%3D13%26type%3D265&difficulty=undefined&judgeStatus=undefined&tags=&title=

class Solution:
    def deleteDuplication(self , pHead: ListNode) -> ListNode:
        # padding data避免特殊情况的复杂处理
        pad_pHead = ListNode(-1)
        pad_pHead.next = pHead
        pad_pHead1 = ListNode(-2)
        pad_pHead1.next = pad_pHead
        pad_pHead2 = ListNode(-3)
        pad_pHead2.next = pad_pHead1

        cur_node = pad_pHead2
        pal1_node = cur_node.next
        pal2_node = pal1_node.next
        find_dup = 0  # 设置一个状态,表示当前是否已找到重复元素
        while pal2_node:
            if pal1_node.val == pal2_node.val:  # 如果pal1和pal2相等,则向右移动pal2
                find_dup = 1  # 找到重复元素
                if not pal2_node.next:  # pal2为最终节点,迭代终止
                    cur_node.next = None
                    break
                else:  # cur_node和pal1_node不动,pal2右移,进入下一次迭代
                    pal2_node = pal2_node.next 
                    continue
			## 如果pal1和pal2不等(上面的continue和break保证了相等时不会进入),进入以下代码
            if find_dup:
				# 之前的迭代已经找到重复元素,所以cur_node的next要更新到pal2_node,pal1和pal2相应更新
                cur_node.next = pal2_node
                pal1_node = pal2_node
                pal2_node = pal2_node.next
            else:
				# 之前的迭代未找到重复元素,所以cur,pal1和pal2相应往后移动一个即可
                cur_node = cur_node.next
                pal1_node = pal1_node.next
                pal2_node = pal2_node.next  # 不要用cur_node = pal1_node,浅拷贝会同时改变两者
            find_dup = 0
        pad_pHead2 = pad_pHead2.next.next.next  # 去pad
        return pad_pHead2

基本思路是一个指针a指向检查点,另外两个b、c用于判断后续元素是否重复

  1. 三指针,b是可能的重复元素起点,c是可能的重复元素终点
  2. 状态机,三个指针的移动方式在是否已经找到重复序列时是不一样的
  3. 序列pad,老生常谈,避免特殊长度序列的复杂分支
全部评论

相关推荐

03-24 13:24
已编辑
江西农业大学 后端工程师
最近或许大家都听说xxxx厂裁员,无论前端,后端,大数据,测试,运维,人人可危, “前端死了,后端也死了,JAVA崩盘了,你们这群搞大模型的真是码奸”这次AI真的会让我们无路可走吗????????太阳底下已经没有新鲜事了旧的生产力的消失,必然有新的生产力诞生马车夫消失 → 汽车司机、修车工、石油工业诞生,从业人数是马车夫的百倍手工纺织女工消失 → 纺织机械工程师、面料设计师诞生,纺织品产量提升百倍2007年苹果开放 App Store,"移动端开发者"这个职业压根不存在。八年后,全球应用经济规模突破 1000亿美元,凭空诞生了数百万开发者岗位。每一次"这次真的完了...
二十岁的编程男神王大...:那这个时代是什么时代呢? 是全员agent的时代,是前端+AI,后端+AI的时代,AI已经融入了项目生命周期的的每一个角落,那我最近在做的东西举例,检查BUG时,我们会用codex,CC等工具的skill去check,效果好还能直接fix,测试的时候,apifox等工具已经有了AI落地的改造,CI/CD阶段,我们会根据hook去跑AI check脚本,就连不少中间件,也迎来了AI落地的改造,(AI网关,AI在MQ中的运用),都可以去了解下 另外记着,这些东西不是意义,工作只是谋生的一个手段,ai是让开发提效了,但是呢,原先一周的工作流程压缩到了两天内,同时低级的都裁员了,只有高级的去维护,你看似写的大义凛然,或许那天你也会成为你文章里面拒绝往前走的人,你才大二,面对技术有热情是对的
AI求职实录
点赞 评论 收藏
分享
明明就不饿:看不懂你到底会啥,什么岗位
点赞 评论 收藏
分享
02-28 01:18
已编辑
南昌大学 后端工程师
黑皮白袜臭脚体育生:把开源经历放个人项目上边应该更好,就像大部分人都把实习经历放个人项目上边
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 一张图晒出你司的标语 #
4392次浏览 77人参与
# 找AI工作可以去哪些公司? #
9473次浏览 252人参与
# 厦门银行科技岗值不值得投 #
8142次浏览 188人参与
# 你的实习产出是真实的还是包装的? #
20489次浏览 343人参与
# AI面会问哪些问题? #
28386次浏览 570人参与
# 春招至今,你的战绩如何? #
66746次浏览 588人参与
# 开放七大实习专项,百度暑期实习值得冲吗 #
15474次浏览 223人参与
# 从事AI岗需要掌握哪些技术栈? #
9339次浏览 326人参与
# 中国电信笔试 #
32126次浏览 295人参与
# 你做过最难的笔试是哪家公司 #
34602次浏览 250人参与
# 投递几十家公司,到现在0offer,大家都一样吗 #
341022次浏览 2175人参与
# 金三银四,你的春招进行到哪个阶段了? #
22379次浏览 284人参与
# 同bg的你秋招战况如何? #
212250次浏览 1121人参与
# 哪些公司真双非友好? #
69755次浏览 289人参与
# 如何准备秋招 #
78315次浏览 868人参与
# 阿里笔试 #
179113次浏览 1318人参与
# 机械人避雷的岗位/公司 #
62713次浏览 393人参与
# 小马智行求职进展汇总 #
25149次浏览 80人参与
# 第一份工作一定要去大厂吗 #
14992次浏览 122人参与
# 担心入职之后被发现很菜怎么办 #
291406次浏览 1210人参与
# 为了减少AI幻觉,你注入过哪些设定? #
26297次浏览 310人参与
# 应届生第一份工资要多少合适 #
20707次浏览 86人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务