lintcode 中等题:Palindrome Linked List 回文链表
题目
回文链表
设计一种方式检查一个链表是否为回文链表。
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 回文链表相关推荐
- [LeetCode] 234. Palindrome Linked List 回文链表
Given a singly linked list, determine if it is a palindrome. Example 1: Input: 1->2 Output: false ...
- 234. Palindrome Linked List 回文链表
请判断一个链表是否为回文链表. 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 进阶: 你能否用 O(n) 时间复 ...
- LeetCode Palindrome Linked List (回文链表)
题意:给个单链表,判断是否为回文. 思路:有点BT,处理不好都是死循环.一般思路是,二分查找中心点,根据奇偶个元素,反置前半部分,再判断是否回文,再恢复前半部分. 步骤: (1)在二分查找中心点时判断 ...
- 牛客题霸 [ 最长回文子串] C++题解/答案
牛客题霸 [ 最长回文子串] C++题解/答案 题目描述 对于一个字符串,请设计一个高效算法,计算其中最长回文子串的长度. 给定字符串A以及它的长度n,请返回最长回文子串的长度. 题解: 两个方法: ...
- 「HDU6599 I Love Palindrome String」 - 回文自动机
HDU 6599 I Love Palindrome String tags:回文自动机 题意 让你求有多少个 \([l,r]\) 满足 \(s[l,r]\) 和 \(s\left[l,\frac{l ...
- 最长回文串_LeetCode解析,第五题:最长回文子串
LeetCode第五题:最长回文子串 5: 英文题面: Given a string s, find the longest palindromic substring in s. You may a ...
- POJ 1159 Palindrome(字符串变回文:LCS)
POJ 1159 Palindrome(字符串变回文:LCS) http://poj.org/problem? id=1159 题意: 给你一个字符串, 问你做少须要在该字符串中插入几个字符能是的它变 ...
- 最长回文串_第78天——第78题(最长回文串 )
今天又是阴天,不过阴天凉快,我喜欢. 第78天--第78题(最长回文串) 看题目! 给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串. 在构造过程中,请注意区分大小写.比如 ...
- 【leetcode 简单】 第六十七题 回文链表
请判断一个链表是否为回文链表. 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 进阶: 你能否用 O(n) 时间复 ...
- LeetCode每日一题:回文链表(No.234)
题目:回文链表 请判断一个链表是否为回文链表. 复制代码 示例: 输入: 1->2 输出: false输入: 1->2->2->1 输出: true 复制代码 思考: 先用快慢 ...
最新文章
- 上海两年java_两年Java工程师应该掌握的知识点
- 一次线上内存报警的研究
- JS引擎、运行时与调用栈概述
- 玩转GIT系列之【git submodule update出错提示子模组未对路径注册】
- LeetCode Hot100 ---- 排序专题
- pc 图片预览放大 端vue_安利一款简单好用的Vue图片预览插件
- 分布式资本沈波:未来区块链杀手级应用将出现在“+区块链”
- 通信行业力推零信任标准,蔷薇灵动微隔离首批获证
- 8086 按开关灯亮 c语言程序,基于MCS-51的交通灯程序设计(c语言控制直行左转)...
- 使用SoapUI测试Web Service
- ghs文件可以删除吗_电脑C盘快满了,哪些文件可以直接删除掉?带你了解一下...
- Codeforces 1082B Vova and Trophies(前缀+后缀)
- Linux中断(interrupt)子系统之三:中断流控处理层(转)
- STM32F103RCT6实验代码之ADS1115的使用
- 阿里巴巴Java开发规范(终极版v1.3.0)--个人整理
- Oracle物化视图与物化视图日志
- 【SAP PO】SAP PO 接口日志查询(Monitoring)
- 基于struts2的留言板系统简单实现jdbc分页
- FLOPS、TOPS和FLOPs的区别
- soc 设计soc设计 uml实务手册_企业内训“领域建模和领域驱动设计”训练方案(2020年)...