leetcode面试题 02.06. 回文链表,解题心路

1、题目描述

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

试题链接:https://leetcode-cn.com/problems/palindrome-linked-list-lcci/

2、java语言题解一

看到该题,首先想打到的就是使用自己最拿手的语言java来做。首先,我们先来观查题目所给链表的结构:

class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}

由于题目中要求判断一个链表是否回文,因此很自然的一个想法就是,将链表变量,取出其中的值,放在一个有序的容器中。在java中很自然的就想到了list集合,于是就有了下述的解法:

public static boolean isPalindrome(ListNode head) {
List list = new ArrayList();
//定义一个辅助指针,用来遍历链表
ListNode pCurrent = head;
//当链表不为null时,就一直循环
while (pCurrent != null) {
//将该数保存到数组中
list.add(pCurrent.val);
pCurrent = pCurrent.next;
}
//遍历集合,看首尾是否相等
for(int i = 0;i < list.size() / 2;i++) {
if(!list.get(i).equals(list.get(list.size() - i - 1))) {
return false;
}
}
return true;
}

算法效果:

可以看出,该算法在java的提交记录中,时间稍微较慢,当时所需要的内存确实最少的。然而,计算机程序比较关心的是算法的执行效率,因此该算法还得进行改进。

3、java语言题解二

由于上述的算法的执行时间太长,猜想是不是因为使用了List集合而导致的。但是,如果不适用集合,我们的先获取到该链表的长度,然后定义一个大小刚刚适合的数组。代码如下:

public static boolean isPalindrome(ListNode head) {
//定义一个辅助指针,用来遍历链表
ListNode pCurrent = head;
//当链表不为null时,就一直循环
int count = 0;
while (pCurrent != null) {
//计数
count++;
pCurrent = pCurrent.next;
}
//再来一论,装进数组
pCurrent = head;
int[] arr = new int[count];
for(int i = 0;i < count;i++) {
arr[i] = pCurrent.val;
pCurrent = pCurrent.next;
}
//遍历集合,看首尾是否相等
for(int i = 0;i < count / 2;i++) {
if(arr[i] != arr[count - i - 1]) {
return false;
}
}
return true;
}

算法效果:

可以看出,用数组代替集合,增加一次循环后的效率得到大幅度的提升。

4、C语言题解一

奈何,博主目前还是一个本科大学生,在数据结构与算法这门课上垂死挣扎,而考试只允许用C来作答,因此,只有用C语言重写上述的java算法。

  1. 先来看看在C语言中,题目给出的链表的结构题类型
struct ListNode {
int val;
struct ListNode *next;
};

接下来,用C语言来实现上述的java题解二:

bool isPalindrome(struct ListNode* head){
//定义一个辅助指针,用来遍历链表
struct ListNode* pCurrent = head;
//当链表不为null时,就一直循环
int count = 0;
while (pCurrent != NULL) {
//计数
count++;
pCurrent = pCurrent->next;
}
if(count == 0)
return true;
//再来一论,装进数组
pCurrent = head;
int arr[count];
for(int i = 0;i < count;i++) {
arr[i] = pCurrent->val;
pCurrent = pCurrent->next;
}
//遍历集合,看首尾是否相等
for(int i = 0;i < count / 2;i++) {
if(arr[i] != arr[count - i - 1]) {
return false;
}
}
return true;
}

算法效果:

由执行用时可以看出,在C语言的解法中,该算法并不是最优解。

除此之外,还有另外一种思路,就是将链表拆分成两部分,然后使得一部分反转,后遍历两个链表,观察是否相等。但是,该方法经过博主测试后,发现其效率还不如上述解法高效,因此不在叙述,后续如果有新的更高效解法在来叙述。

leetcode面试题 02.06. 回文链表,解题心路的更多相关文章

  1. LeetCode 面试题 02.06. 回文链表

    题目链接:https://leetcode-cn.com/problems/palindrome-linked-list-lcci/ 编写一个函数,检查输入的链表是否是回文的. 示例 1: 输入: 1 ...

  2. [LeetCode] 234. Palindrome Linked List 回文链表

    Given a singly linked list, determine if it is a palindrome. Example 1: Input: 1->2 Output: false ...

  3. [LeetCode] Palindrome Linked List 回文链表

    Given a singly linked list, determine if it is a palindrome. Follow up: Could you do it in O(n) time ...

  4. Leetcode:234 回文链表

    leetcode:234 回文链表 关键点:请判断一个链表是否为回文链表.示例 1:输入: 1->2输出: false示例 2:输入: 1->2->2->1输出: true. ...

  5. Leetcode 234. 回文链表(进阶)

    1.题目描述 请判断一个链表是否为回文链表. 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 进阶: 你能否用 O ...

  6. LeetCode 234:回文链表 Palindrome Linked List

    ​ 请判断一个链表是否为回文链表. Given a singly linked list, determine if it is a palindrome. 示例 1: 输入: 1->2 输出: ...

  7. 【算法训练营day4】LeetCode24. 两两交换链表中的结点 LeetCode19. 删除链表的倒数第N个结点 LeetCode面试题 02.07. 链表相交 LeetCode142. 环形链表II

    [算法训练营day4]LeetCode24. 两两交换链表中的结点 LeetCode19. 删除链表的倒数第N个结点 LeetCode面试题 02.07. 链表相交 LeetCode142. 环形链表 ...

  8. 【leetcode 简单】 第六十七题 回文链表

    请判断一个链表是否为回文链表. 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 进阶: 你能否用 O(n) 时间复 ...

  9. LeetCode OJ:Palindrome Linked List(回文链表判断)

    Given a singly linked list, determine if it is a palindrome. Follow up:Could you do it in O(n) time ...

随机推荐

  1. 生成链接中的全限定URL(Generating Fully Qualified URLs in Links) | 在视图中生成输出URL | 高级路由特性

    结果:<a class="myCSSClass"href="https://myserver.mydomain.com/Home/Index/MyId#myFrag ...

  2. IIS 32位/64位 全局模式切换

    IIS7以上可以对单个应用程序池进行设置. IIS6需要用命令. 一.32位模式1.cscript %systemdrive%\inetpub\adminscripts\adsutil.vbs set ...

  3. MySQL5.6绿色版安装

    1.下载 MySQL绿色版安装需下载好三个文件 (1).MySQL5.6版本离线安装包 (2).Microsoft Visual C++ (3).Microsoft .NET Framework 1. ...

  4. docker扫盲,面试连这都不会就等着挂吧!

    现在很多公司项目部署都是采用K8S docker容器方式,出门面试被问的概率极大,如果被面试官问docker相关知识点直接懵逼,那么基本就是被pass了,除非其他方面技术过硬.所以这种相对前沿的技术, ...

  5. Distance Dependent Infinite Latent Feature Model 阅读笔记1

    阅读文献:Distance Dependent Infinite Latent Feature Model 作者:Samuel J.Gershman ,Peter I.Frazier ,and Dav ...

  6. 深入分析Java反射(一)-核心类库和方法

    前提 Java反射的API在JavaSE1.7的时候已经基本完善,但是本文编写的时候使用的是Oracle JDK11,因为JDK11对于sun包下的源码也上传了,可以直接通过IDE查看对应的源码和进行 ...

  7. Docker快速上手之部署SpringBoot项目

    Docker是基于Go语言实现的云开源项目. Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装.分发.部署.运行等生命周期 ...

  8. HTTPS详解二:SSL / TLS 工作原理和详细握手过程

    HTTPS 详解一:附带最精美详尽的 HTTPS 原理图 HTTPS详解二:SSL / TLS 工作原理和详细握手过程 在上篇文章HTTPS详解一中,我已经为大家介绍了 HTTPS 的详细原理和通信流 ...

  9. ros之参数的使用与编程方法

    参数模型 ROS Master (Parameter Server) /robot_name: "my_robot"        ----{Node A   Node B} /r ...

  10. Harbor 1.9.x 版本从源码构建和运行

    介绍 本指南为开发人员提供了从源代码构建和运行Harbor的说明. 步骤1:为Harbor的构建环境做准备 Harbor被部署为多个Docker容器,并且大多数代码都是用Go语言编写的.构建环境需要D ...