码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【Leetcode】拿捏链表(三)——CM11 链表分割(牛客)、OR36 链表的回文结构(牛客)


     作者:一个喜欢猫咪的的程序员 

    专栏:《Leetcode》

    喜欢的话:世间因为少年的挺身而出,而更加瑰丽。                                  ——《人民日报》


    目录

    CM11 链表分割

    OR36 链表的回文结构


    CM11 链表分割

    链表分割_牛客题霸_牛客网【牛客题霸】收集各企业高频校招笔面试题目,配有官方题解,在线进行百度阿里腾讯网易等互联网名企笔试面试模拟考试练习,和牛人一起讨论经典试题,全面提升你的技术能力https://www.nowcoder.com/practice/0e27e0b064de4eacac178676ef9c9d70题目:

    现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。


    示例:

    本题没有示例


    思路:

    本题我们利用两个guard1、guard2带头的链表,将他们合成一个链表来完成。

    我们开辟一个链表结构体struct ListNode大小的动态空间n1、n2,将其强制类型转换为结构体指针struct ListNode*来将题目给的链表分为两个小链表。

    我们让n1和guard1指向同一块动态空间,n2和guard2也是同理。

    我们利用一个cur来遍历原链表,如果val比x小就尾插到第一个链表n1中,负责尾插到第二个链表n2中。

     我们需要额外考虑一种情况,当第二个链表的尾不是原链表的最后一个时,n2的next不为空会出现环装链表的问题,我们需要将n2.next=NULL。

    时间复杂度:O(N)                                                             空间复杂度:O(N)


    代码实现:

    1. class Partition {
    2. public:
    3. ListNode* partition(ListNode* pHead, int x) {
    4. // write code here
    5. struct ListNode* guard1;
    6. struct ListNode* guard2;
    7. struct ListNode* cur=pHead;
    8. struct ListNode* n1;
    9. struct ListNode* n2;
    10. n1=guard1=(struct ListNode*)malloc(sizeof(struct ListNode));
    11. n2=guard2=(struct ListNode*)malloc(sizeof(struct ListNode));
    12. n2->next=n1->next=NULL;
    13. while(cur)
    14. {
    15. if(cur->val<x)
    16. {
    17. n1->next=cur;
    18. n1=n1->next;
    19. }
    20. else
    21. {
    22. n2->next=cur;
    23. n2=n2->next;
    24. }
    25. cur=cur->next;
    26. }
    27. n1->next=guard2->next;
    28. n2->next=NULL;
    29. pHead=guard1->next;
    30. free(guard1);
    31. free(guard2);
    32. return pHead;
    33. }
    34. };

    OR36 链表的回文结构

    链表的回文结构_牛客题霸_牛客网【牛客题霸】收集各企业高频校招笔面试题目,配有官方题解,在线进行百度阿里腾讯网易等互联网名企笔试面试模拟考试练习,和牛人一起讨论经典试题,全面提升你的技术能力https://www.nowcoder.com/practice/d281619e4b3e4a60a2cc66ea32855bfa题目:

    对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。


    示例:


    思路:

    本题要求我们必须在O(1)的空间复杂度,因此我们不能去开数组,将他们一个个存起来。

    我们可以将链表的后半段逆置,然后再将中间节点与头结点的元素做比较,判断是否相等。

    这里逆置和查找中间节点的函数可以看一下我的另外2篇博客:

    http://t.csdn.cn/82sv7http://t.csdn.cn/82sv7http://t.csdn.cn/HAJ2Ahttp://t.csdn.cn/HAJ2A时间复杂度:O(N)                                                               空间复杂度:O(1)


    代码实现:

    1. class PalindromeList {
    2. public:
    3. struct ListNode* reverseList(struct ListNode* head){
    4. if (head == NULL || head->next == NULL) {
    5. return head;
    6. }
    7. struct ListNode*newhead=reverseList(head->next);
    8. head->next->next=head;
    9. head->next=NULL;
    10. return newhead;
    11. }
    12. struct ListNode* middleNode(struct ListNode* head){
    13. if(head->next==NULL)
    14. {
    15. return head;
    16. }
    17. struct ListNode*left=head;
    18. struct ListNode*right=head;
    19. struct ListNode*ans=head;
    20. while(right!=NULL&&right->next!=NULL)
    21. {
    22. left=left->next;
    23. right=right->next->next;
    24. }
    25. ans=left;
    26. return ans;
    27. }
    28. bool chkPalindrome(ListNode* A) {
    29. // write code here
    30. struct ListNode*mid=middleNode(A);
    31. struct ListNode*rhead=reverseList(mid);
    32. while(A&&rhead)
    33. {
    34. if(A->val!=rhead->val)
    35. return false;
    36. A=A->next;
    37. rhead=rhead->next;
    38. }
    39. return true;
    40. }
    41. };

  • 相关阅读:
    Django 删除单行数据
    设计模式-Observer模式(观察者模式)
    Android GPU版本和占用
    【深度学习】 Python 和 NumPy 系列教程(十四):Matplotlib详解:1、2d绘图(下):箱线图、热力图、面积图、等高线图、极坐标图
    JavaScript内置对象 - Array数组(二)- 方法
    python之 pyCharm pip安装pandas库失败
    四川竹哲电子商务有限公司培训服务引领你走向成功
    奥特曼卡牌隐藏的百亿市场
    深入理解 Java 中的 synchronized 代码块
    如何在Windows 11和10上清除更新缓存?这里提供了几种方法
  • 原文地址:https://blog.csdn.net/m0_69061857/article/details/128007616
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号