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. windows10卸载虚拟机忘记按照步骤卸载的实际问题

    好久没有写博客了,由于太多事情,工作需要用到虚拟机,结果,虚拟机出问题,,,怎么办???我的办法就是卸载了重新安装一个,结果呢?太心急没有按照不知操作,今天弄了一下午,终于弄好了... 错误原因,用了 ...

  2. 大事务造成的延迟(从binlog入手分析)

    log_event.cc 入口: int Query_log_event::do_apply_event(Relay_log_info const *rli,const char *query_arg ...

  3. Git详解之初次运行

    配置文件 一般在新的系统上,我们都需要先配置下自己的 Git 工作环境.配置工作只需一次,以后升级时还会沿用现在的配置.当然,如果需要,你随时可以用相同的命令修改已有的配置. Git 提供了一个叫做 ...

  4. 容器技术与docker

    名词介绍 IaaS:基础设施即服务,要搭建上层数据应用,先得通过互联网获得基础性设施服务 PaaS:平台即服务,搭建平台,集成应用产品,整合起来提供服务 SaaS:软件即服务,通过网络提供程序应用类服 ...

  5. 文件系统(02):基于SpringBoot框架,管理Xml和CSV文件类型

    本文源码:GitHub·点这里 || GitEE·点这里 一.文档类型简介 1.XML文档 XML是可扩展标记语言,是一种用于标记电子文件使其具有结构性的标记语言.标记指计算机所能理解的信息符号,通过 ...

  6. centos7 配置虚拟交换机(物理交换机truck端口设置)(使用brctl)

    转自:http://blog.csdn.net/qq_21398167/article/details/46409503 虚拟交换机配置 inux VLAN配置(vconfig) 安装vlan(vco ...

  7. LeetCode 200. Number of Islands 岛屿数量(C++/Java)

    题目: Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. An island is s ...

  8. 视觉slam十四讲课后习题ch3-7

    题目回顾: 设有小萝卜一号和小萝卜二号位于世界坐标系中,小萝卜一号的位姿为:q1=[0.35,0.2,0.3,0.1],t2=[0.3,0.1,0.1]^T (q的第一项为实部.请你把q归一化后在进行 ...

  9. Codeforces_723_D

    http://codeforces.com/problemset/problem/723/D dfs找出每个湖,保存坐标和大小,按大小排序,填充湖即可,注意湖的数量最多会有1250个. #includ ...

  10. MySQL学习笔记——基础与进阶篇

    目录 一.###MySQL登录和退出 二.###MySQL常用命令 三.###MySQL语法规范 四.###基础查询 五.###条件查询 六.###排序查询 七.###常见函数的学习 八.###分组查 ...