题目

回文链表

设计一种方式检查一个链表是否为回文链表。

样例

1->2->1 就是一个回文链表。

挑战

O(n)的时间和O(1)的额外空间。

解题

法一:

再定义一个链表,存放链表反转的值,再以此比较两个链表中的值是否相等,时间复杂度O(N),空间复杂度O(N)

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode(int x) { val = x; }* }*/
public class Solution {/*** @param head a ListNode* @return a boolean*/public boolean isPalindrome(ListNode head) {// Write your code hereArrayList<Integer> list = new ArrayList<Integer>();if(head == null || head.next == null)return true;ListNode p = head;ListNode prev = new ListNode(head.val);while(p.next != null){ListNode tmp = new ListNode(p.next.val);tmp.next = prev;prev = tmp;p = p.next;}ListNode p1 = head;ListNode p2 = prev;while(p1!=null){if(p1.val != p2.val)return false;p1 = p1.next;p2 = p2.next;}return true;}
}

Java Code

总耗时: 2219 ms

Python下面程序出现内存溢出

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = Noneclass Solution:# @param head, a ListNode# @return a booleandef isPalindrome(self, head):# Write your code hereif head == None or head.next == None:return Truep = headprev = ListNode(head.val)while p.next!=None:tmp = ListNode(p.next.val)tmp.next = prevprev = tmpp = p.nextp1 = headp2 = prevdel headdel prevwhile p1!=None:if p1.val != p2.val:return Falsep1 = p1.nextp2 = p2.nextreturn True 

Python Code

法二:

先找到链表的中间节点,根据中间节点划分成两个链表,对第二个链表反转后在和第一个链表元素以此比较,但是下面的程序,在旋转的过程中空间复杂度好像是O(N/2) = O(N)

在找中间节点时候需要说明下

        ListNode slow = head;ListNode fast = head;// 找到两个链表的中间节点while( fast.next!=null && fast.next.next!=null){fast = fast.next.next;slow = slow.next;}

开始时候两个节点都指向第一个节点,以后两个异步的向前走

最后结束的时候

当长度是奇数的时候:slow恰好在中间节点,fast恰好在最后一个节点。slow.next就是下一个链表的头节点。你会发现这两个链表是不一样的长的,但是在比较的时候,只要有一个链表是null的时候就结束比较的,也就是说只与第二个链表有关系的。

当长度是偶数的时候:slow在N/2的下取整处的节点,也就是中间两个节点的前一个,二fast在倒数第二个节点,下面就一样了

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode(int x) { val = x; }* }*/
public class Solution {/*** @param head a ListNode* @return a boolean*/public boolean isPalindrome(ListNode head) {// Write your code hereif(head == null || head.next == null)return true;ListNode slow = head;ListNode fast = head;// 找到两个链表的中间节点while( fast.next!=null && fast.next.next!=null){fast = fast.next.next;slow = slow.next;}ListNode secondHead = slow.next;slow.next = null;// 后半部分的节点反转ListNode p1 = secondHead;ListNode revsecondList = new ListNode(p1.val);revsecondList.next = null;while(p1.next != null){ListNode tmp = new ListNode(p1.next.val);tmp.next = revsecondList;revsecondList = tmp;p1 = p1.next;}// 比较两个链表while(head!=null && revsecondList!=null){if(head.val != revsecondList.val)return false;head = head.next;revsecondList = revsecondList.next;}return true;}
}

Java Code

总耗时: 2229 ms

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = Noneclass Solution:# @param head, a ListNode# @return a booleandef isPalindrome(self, head):# Write your code hereif head == None or head.next == None:return Trueslow = headfast = headwhile fast.next != None and fast.next.next != None:fast = fast.next.nextslow = slow.nextsecondHead = slow.nextslow.next = Nonep = secondHeadrev = ListNode(p.val) while p.next!=None:tmp = ListNode(p.next.val)tmp.next = revrev = tmpp = p.nextwhile rev!=None and head!=None:if rev.val != head.val:return Falserev = rev.nexthead = head.nextreturn True 

Python Code

总耗时: 528 ms

在旋转链表的时候有重新定义了节点,如何只是修改节点而实现翻转,下面利用递归的思想翻转链表,但是在测试到97%的数据的时候运行时间超时。

    public ListNode reverse(ListNode head){if(head == null || head.next == null)return head;ListNode second = head.next;head.next = null;ListNode res = reverse(second);second.next = head;return res;}

Java Code

下面是定义两个指针,第一个指向头节点,第二个指向头节点后一个节点

p1 = head
p2 = p1.nextwhile(p1!= null && p2!= null){
ListNode tmp = p2.next;
p2.next = p1;
p1 = p2;
p2 = tmp;
}

操作如下图所示

这里可以最后A还指向B的,可以在初始定义中增加

p1 .next = null

这样每次都是在p1节点之前增加一个节点的

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode(int x) { val = x; }* }*/
public class Solution {/*** @param head a ListNode* @return a boolean*/public boolean isPalindrome(ListNode head) {// Write your code hereif(head == null || head.next == null)return true;ListNode slow = head;ListNode fast = head;// 找到两个链表的中间节点while( fast.next!=null && fast.next.next!=null){fast = fast.next.next;slow = slow.next;}ListNode secondHead = slow.next;slow.next = null;// 后半部分的节点反转ListNode p1 = secondHead;ListNode p2 = p1.next;p1.next = null;while(p1!= null && p2!= null){ListNode tmp = p2.next;p2.next = p1;p1 = p2;p2 = tmp;}secondHead.next = null;revsecondList = p1;// 比较两个链表while(head!=null && revsecondList!=null){if(head.val != revsecondList.val)return false;head = head.next;revsecondList = revsecondList.next;}return true;}
}

Java Code

总耗时: 2192 ms

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = Noneclass Solution:# @param head, a ListNode# @return a booleandef isPalindrome(self, head):# Write your code hereif head == None or head.next == None:return Truefast = headslow = headwhile fast.next!= None and fast.next.next!=None:fast =fast.next.nextslow = slow.nextsecondhead = slow.nextslow.next = Nonep1 = secondheadp2 = p1.nextp1.next = Nonewhile p1!=None and p2!=None:tmp = p2.nextp2.next = p1p1 = p2p2 = tmprev = p1while rev!=None and head!=None:if rev.val!=head.val:return Falserev = rev.nexthead = head.nextreturn True 

Python Code

总耗时: 516 ms

lintcode 中等题:Palindrome Linked List 回文链表相关推荐

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

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

  2. 234. Palindrome Linked List 回文链表

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

  3. LeetCode Palindrome Linked List (回文链表)

    题意:给个单链表,判断是否为回文. 思路:有点BT,处理不好都是死循环.一般思路是,二分查找中心点,根据奇偶个元素,反置前半部分,再判断是否回文,再恢复前半部分. 步骤: (1)在二分查找中心点时判断 ...

  4. 牛客题霸 [ 最长回文子串] C++题解/答案

    牛客题霸 [ 最长回文子串] C++题解/答案 题目描述 对于一个字符串,请设计一个高效算法,计算其中最长回文子串的长度. 给定字符串A以及它的长度n,请返回最长回文子串的长度. 题解: 两个方法: ...

  5. 「HDU6599 I Love Palindrome String」 - 回文自动机

    HDU 6599 I Love Palindrome String tags:回文自动机 题意 让你求有多少个 \([l,r]\) 满足 \(s[l,r]\) 和 \(s\left[l,\frac{l ...

  6. 最长回文串_LeetCode解析,第五题:最长回文子串

    LeetCode第五题:最长回文子串 5: 英文题面: Given a string s, find the longest palindromic substring in s. You may a ...

  7. POJ 1159 Palindrome(字符串变回文:LCS)

    POJ 1159 Palindrome(字符串变回文:LCS) http://poj.org/problem? id=1159 题意: 给你一个字符串, 问你做少须要在该字符串中插入几个字符能是的它变 ...

  8. 最长回文串_第78天——第78题(最长回文串 )

    今天又是阴天,不过阴天凉快,我喜欢. 第78天--第78题(最长回文串) 看题目! 给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串. 在构造过程中,请注意区分大小写.比如 ...

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

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

  10. LeetCode每日一题:回文链表(No.234)

    题目:回文链表 请判断一个链表是否为回文链表. 复制代码 示例: 输入: 1->2 输出: false输入: 1->2->2->1 输出: true 复制代码 思考: 先用快慢 ...

最新文章

  1. 上海两年java_两年Java工程师应该掌握的知识点
  2. 一次线上内存报警的研究
  3. JS引擎、运行时与调用栈概述
  4. 玩转GIT系列之【git submodule update出错提示子模组未对路径注册】
  5. LeetCode Hot100 ---- 排序专题
  6. pc 图片预览放大 端vue_安利一款简单好用的Vue图片预览插件
  7. 分布式资本沈波:未来区块链杀手级应用将出现在“+区块链”
  8. 通信行业力推零信任标准,蔷薇灵动微隔离首批获证
  9. 8086 按开关灯亮 c语言程序,基于MCS-51的交通灯程序设计(c语言控制直行左转)...
  10. 使用SoapUI测试Web Service
  11. ghs文件可以删除吗_电脑C盘快满了,哪些文件可以直接删除掉?带你了解一下...
  12. Codeforces 1082B Vova and Trophies(前缀+后缀)
  13. Linux中断(interrupt)子系统之三:中断流控处理层(转)
  14. STM32F103RCT6实验代码之ADS1115的使用
  15. 阿里巴巴Java开发规范(终极版v1.3.0)--个人整理
  16. Oracle物化视图与物化视图日志
  17. 【SAP PO】SAP PO 接口日志查询(Monitoring)
  18. 基于struts2的留言板系统简单实现jdbc分页
  19. FLOPS、TOPS和FLOPs的区别
  20. soc 设计soc设计 uml实务手册_企业内训“领域建模和领域驱动设计”训练方案(2020年)...

热门文章

  1. c#-多线程中lock用法的经典实例
  2. python剔除异常值的方法_二维d异常值的剔除方法
  3. Layui组件 sliderVerify 实现滑块验证
  4. PAT (Advanced Level) Practice 1001 A+B Format (20分)
  5. 管理新语:不愿意做的事情,与其应付,不如直接明说
  6. 文字处理(WORD/WP)中,布局与绘制必然分开
  7. JS中字串转参数用的false/true
  8. LINUX使用消息队列的代码
  9. 原来喔趣是吾以前的同事开发的
  10. C读取INI的代码实例