当前位置: 首页 > news >正文

回文链表(leetcode)

我自己第一个写的代码:

bool isPalindrome(struct ListNode* head){struct ListNode* tail = NULL;struct ListNode* pos = NULL;if( head->next == NULL){return true;}while( 1 ){if(  head->next == NULL || (head->next->next == NULL && head->val==head->next->val) ){return true;}for( tail = head ; tail->next->next != NULL ; tail = tail->next);if( head->val != tail->next->val)return false;if(  head->next == NULL || head->next->next == NULL ){return true;}pos = head;head = head->next;tail->next = NULL;pos->next = NULL;}
}

1               2                  3                 2               1 

比较第一个数和最后一个数,注意不要把指针放在最后,因为要将最后的链点删除,则考虑倒数第二个链点,并且if条件判断要放在两处,为了防止对空指针解引用

但此时时间复杂度过高O(n)  循环内的代码均要执行一遍,导致超时

算法:首先将链表分成两节,将后一节的链表翻转,在一一比较

1             2             3             3                2            1       

1            2               3   ||   3        2           1

1       2           3          ||      1           2         3

struct ListNode* rollback( struct ListNode* head )
{
    struct ListNode* pos = (struct ListNode*)malloc(sizeof(struct ListNode));
    struct ListNode* p1 = head;
    struct ListNode* p2 = head->next;
    while( p2 != NULL )
    {
        p1->next = p2->next;
        p2->next = pos->next;
        pos->next = p2;
        p2 = p1->next;
    }
    return pos->next;
}
        
struct ListNode* get_listnode(struct ListNode* head)
{
    struct ListNode* fast = head->next;
    struct ListNode* slow = head;
    struct ListNode* arr = NULL;
    while( fast != NULL && fast->next != NULL)
    {
        fast = fast->next->next;
        slow = slow->next;
    }
    arr = slow->next;
    slow->next = NULL;
    return arr;
}

bool isPalindrome(struct ListNode* head){

    struct ListNode* mid_listnode = NULL;
    struct ListNode* tail = NULL;
    if( head == NULL )
    {
        return true;
    }
    mid_listnode = get_listnode(head);
    tail = rollback(mid_listnode);
    while( tail != NULL )
    {

        if( head->val != tail->val )
        {
            return false;
        }
        tail = tail->next;
        head = head->next;
    } 这里的比较执行n/2次

    return true;
}

时间复杂度分析:rollback函数内的语句执行n/2次

                             get_listnode函数内的语句执行n/2次

                           T =   O(n)

空间复杂度:O(1)

http://www.lryc.cn/news/309094.html

相关文章:

  • 大语言模型(LLM)技术名词表(一)
  • C++ 快速排序快速选择
  • 雅马哈伺服器TS-S系列说明具体详情内容可参看PDF目录内容
  • SpringBoot底层原理
  • 【golang】25、图片操作
  • kswapd0挖矿病毒攻击记录
  • 如何使用 takeUntil RxJS 操作符来声明性地管理订阅
  • 在Centos中用Docker部署oracle-12c
  • JS进阶——高级技巧
  • TG-ADMIN 权限管理系统
  • 十五届蓝桥杯第三期模拟赛题单(C++、java、Python)
  • 嵌入式驱动学习第一周——git的使用
  • 界面控件DevExpress .NET MAUI v23.2新版亮点 - 拥有全新的彩色主题
  • 大语言模型LLM Pro+中Pro+(Prompting)的意义
  • React 中,children 属性
  • 多行业万能预约门店小程序源码系统 支持多门店预约小程序 带完整的安装代码包以及搭建教程
  • Node.js 中 fs 模块文件操作的应用教程
  • 一些常用到的git命令
  • spring boot3解决跨域的几种方式
  • 【Spring】19 @Autowired注解使用详解
  • Educational Codeforces Round 132 (Rated for Div. 2) E. XOR Tree(启发式合并+贪心)
  • JavaScript 基本数据类型的详解
  • DDR5内存相比DDR4内存的优势和区别?选择哪一个服务器内存配置能避免丢包和延迟高?
  • 篮球游戏中的挑战精神与怄气心理:扣篮被帽后的再度冲击
  • JavaScript高级程序设计
  • 初阶数据结构:栈与队列
  • Houdini学习笔记
  • 电销机器人识别客户情绪状态
  • AI推介-大语言模型LLMs论文速览(arXiv方向):2024.02.25-2024.03.01
  • Cesium插件系列——3dtiles压平