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

LeetCode 面试题 02.06. 回文链表

文章目录

  • 一、题目
  • 二、C# 题解

一、题目

  编写一个函数,检查输入的链表是否是回文的。

  点击此处跳转题目。

示例 1:

输入: 1->2
输出: false

示例 2:

输入: 1->2->2->1
输出: true

进阶:

  • 你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?

二、C# 题解

  使用 O ( n ) O(n) O(n) 空间很容易写出来,只需要开辟一个数组或者反向链表即可。这里为了实现进阶要求,在原链表上修改。首先将链表的前半部分翻转,然后比较前后两个链表是否相同,最后恢复原链表即可,具体实现细节见代码注释:

/*** Definition for singly-linked list.* public class ListNode {*     public int val;*     public ListNode next;*     public ListNode(int x) { val = x; }* }*/
public class Solution {public bool IsPalindrome(ListNode head) {int n = 0, i;ListNode p = head, q;bool result;// 统计链表长度while (p != null) {p = p.next;n++;}if (n <= 1) return true;    // 长度 <= 1,一定是回文串i = n / 2;                  // 长度的一半,向下取整p = head;while (--i > 0) p = p.next; // 定位到链表中间q = p.next;p.next = null;              // 断开链表Reverse(head);              // 翻转前半部分// 判断链表前后两部分是否相同if (n % 2 == 0) result = Same(p, q);else result = Same(p, q.next); // 奇数长度的链表需要跳过最中间的元素// 恢复链表原状Reverse(p);p.next = q;return result;}// 翻转链表public ListNode Reverse(ListNode head) {ListNode p = null, q = head, r;while (q != null) {r = q.next;q.next = p;p = q;q = r;}return p;}// 比较两个链表是否相同public bool Same(ListNode h1, ListNode h2) {while (h1 != null && h2 != null) {if (h1.val != h2.val) return false;h1 = h1.next;h2 = h2.next;}return h1 == null && h2 == null;}
}
  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( 1 ) O(1) O(1)

  看了一下官方解法,发现还可以进行优化。使用快慢指针定位到中间节点,代码会更加高级和优雅hh。但是效率和上面统计长度然后遍历一半进行定位的方式差不多,因为都是遍历了一个半链表(快指针遍历整个链表,慢指针遍历半个链表),但是快慢指针这种方法它显得高级呀哈哈!

/*** Definition for singly-linked list.* public class ListNode {*     public int val;*     public ListNode next;*     public ListNode(int x) { val = x; }* }*/
public class Solution {public bool IsPalindrome(ListNode head) {if (head == null || head.next == null) return true;ListNode p = head, q = p.next; // p:慢指针,q:快指针bool result;while (q != null && q.next != null) {q = q.next.next;           // q 前进两格if (q != null) p = p.next; // q 不为空,p 才前进}ListNode r = p.next;           // 定位到后半段链表的首部p.next = null;                 // 断开链表Reverse(head);                 // 翻转前半部分// 判断链表前后两部分是否相同if (q != null) result = Same(p, r);else result = Same(p, r.next); // 奇数长度的链表需要跳过最中间的元素// 恢复链表原状Reverse(p);p.next = r;return result;}// 翻转链表public ListNode Reverse(ListNode head) {ListNode p = null, q = head, r;while (q != null) {r = q.next;q.next = p;p = q;q = r;}return p;}// 比较两个链表是否相同public bool Same(ListNode h1, ListNode h2) {while (h1 != null && h2 != null) {if (h1.val != h2.val) return false;h1 = h1.next;h2 = h2.next;}return h1 == null && h2 == null;}
}
  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( 1 ) O(1) O(1)

  修改过后,发现快慢指针跑出来的速度不如直接统计链表长度来得快。果然,高端的代码往往以最朴素的方法写出来~

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

相关文章:

  • linux环境没有curl或者telnet命令解决方法与区分linux环境类型
  • golang channel
  • 高等职业学校物联网实训室建设方案
  • Python基础学习第四天:Python注释
  • Puppeteer中使用Stealth.min.js库
  • JVM ZGC垃圾收集器
  • 事务管理-事务进阶-propagation属性
  • 树多选搜索查询,搜索后选中状态仍保留
  • 数据结构--字典树(trie)
  • iframe通过postMessage进行跨域通信以及在Angular中使用
  • rust学习-引用C库
  • WebAssembly 在云原生中的实践指南
  • Azure sqlserver 更改字符集
  • git push时,由于commit了大文件无法成功push的解决办法
  • 2023_Spark_实验一:Windows中基础环境安装
  • 如何在Windows / Mac / iPhone / Android / Online上将MP4转换为MP3
  • 【App端】uni-app使用百度地图api和echarts省市地图下钻
  • 深度学习(十)--- cv2.pointPolygonTest() 判断一点是否在指定区域内
  • 后端面试话术集锦第 八 篇:redis面试话术
  • LiteOS qemu realview-pbx-a9 环境搭建与运行
  • Kubernetes技术--Kubernetes架构组件以及核心概念
  • 拿来即用修改密码功能
  • 违背原则才能写好代码(一)
  • 面试官眼中的理想候选人:如何成为他们的首选
  • ES6中的扩展运算符你真的会用吗?
  • 利用逻辑回归判断病人肺部是否发生病变
  • 全民健康生活方式行动日,天猫健康联合三诺生物推出“15天持续测糖计划”
  • 设计模式行为型-状态模式
  • 弹窗、抽屉、页面跳转区别 | web交互入门
  • 说说Flink运行模式