[LeetCode][JavaScript]Palindrome Linked List

Palindrome Linked List

Given a singly linked list, determine if it is a palindrome.

Follow up:
Could you do it in O(n) time and O(1) space?

https://leetcode.com/problems/palindrome-linked-list/



判断单链表是否为回文,要求时间复杂度O(n),空间复杂度O(1)。

如果对空间复杂度没有要求,有两种简单的做法。

一种是开个数组,把链表里的值挨个塞进去,然后双指针。

还有一种是做一轮遍历,把单链表变成双链表(javasrcipt可以修改实例化的对象), 然后双指针。

时间复杂度O(n),空间复杂度O(1)的解法:

1.第一轮遍历用快慢指针(快指针每次走两步,慢指针每次走一步)寻找中点 -> O(n)

2.反转后半段链表 -> O(n/2)

3.比较 -> O(n/2)

合起来时间还是O(n)。

你确定这是easy?

 1 /**
 2  * Definition for singly-linked list.
 3  * function ListNode(val) {
 4  *     this.val = val;
 5  *     this.next = null;
 6  * }
 7  */
 8 /**
 9  * @param {ListNode} head
10  * @return {boolean}
11  */
12 var isPalindrome = function(head) {
13     //find middle
14     var slow = head, fast = head, cacheHead = head;
15     while(fast !== null && fast.next !== null){
16         slow = slow.next;
17         fast = fast.next.next;
18     }
19
20     //reverse link list
21     var list2Head = new ListNode("head"), tmp;
22     while(slow !== null){
23         tmp = slow;
24         slow = slow.next;
25         tmp.next = list2Head.next;
26         list2Head.next = tmp;
27     }
28
29     //judge palindrom
30     var list1 = cacheHead, list2 = list2Head.next;
31     for(; list2 !== null; list1 = list1.next, list2 = list2.next){
32         if(list1.val !== list2.val){
33             return false;
34         }
35     }
36     return true;
37 };
时间: 2024-08-06 10:00:22

[LeetCode][JavaScript]Palindrome Linked List的相关文章

leetCode 234. Palindrome Linked List 链表

234. Palindrome Linked List Given a singly linked list, determine if it is a palindrome. Follow up:Could you do it in O(n) time and O(1) space? 题目大意: 判断一个单链表是否为回文链表. 思路: 找到链表中间的节点,将链表从中间分为2部分,右半部分进行链表反向转换,然后左半部分和反转后的右半部分链表进行比较.得出结果. 代码如下: /**  * Defi

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

Given a singly linked list, determine if it is a palindrome. Follow up:Could you do it in O(n) time and O(1) space? 题目标签:Linked List 题目给了我们一个 linked list,让我们判断它是不是回文. 这里可以利用 #206 Reverse Linked List 把右边一半的链表 倒转,然后从左右两头开始比较链表是否是回文. 这样的话,首先要找到链表的中间点,然后

Java [Leetcode 234]Palindrome Linked List

题目描述: Given a singly linked list, determine if it is a palindrome. Follow up:Could you do it in O(n) time and O(1) space? 解题思路: 使用O(n)的时间复杂度及O(1)的时间复杂度表明顺序遍历链表以及不能够开辟跟链表相当的空间,这样可以找出中间的位置,然后将后半部分的链表反转,然后跟前半部分的链表逐个位置比对. 代码如下: /** * Definition for singl

LeetCode 234 Palindrome Linked List

Given a singly linked list, determine if it is a palindrome. 思路: 回文结构从后向前遍历与从前向后遍历的结果是相同的,可以利用一个栈的结构,将出栈元素与正向移动的指针指向元素比较,即可判断. 解法: 1 /* 2 public class ListNode 3 { 4 int val; 5 ListNode next; 6 7 ListNode(int x) 8 { val = x; } 9 } 10 */ 11 12 import

[LeetCode] 234. Palindrome Linked List 解题思路

Given a singly linked list, determine if it is a palindrome. Follow up:Could you do it in O(n) time and O(1) space? 问题:给定一个单向列表结构,判断它是不是回文的. 补充:是否可以在 O(n) 时间,O(1) 额外空间下完成? 解题思路: 对于数组,判断是否是回文很好办,只需要用两个指针,从两端往中间扫一下就可以判定. 对于单向列表,首先想到的是,将列表复制一份到数组中,然后用上面

[LeetCode][JavaScript]Reverse Linked List II

Reverse Linked List II Reverse a linked list from position m to n. Do it in-place and in one-pass. For example:Given 1->2->3->4->5->NULL, m = 2 and n = 4, return 1->4->3->2->5->NULL. Note:Given m, n satisfy the following cond

LeetCode 234 Palindrome Linked List(回文链表)(*)(?)

翻译 给定一个单链表,确定它是否是回文的. 跟进: 你能够在O(n)时间和O(1)空间下完毕它吗? 原文 Given a singly linked list, determine if it is a palindrome. Follow up: Could you do it in O(n) time and O(1) space? 进阶 bool judge(ListNode *head, ListNode* &cur) { if (!head) return true; if (!jud

[LeetCode][JavaScript]Remove Linked List Elements

Remove Linked List Elements Remove all elements from a linked list of integers that have value val. ExampleGiven: 1 --> 2 --> 6 --> 3 --> 4 --> 5 --> 6, val = 6Return: 1 --> 2 --> 3 --> 4 --> 5 https://leetcode.com/problems/r

(easy)LeetCode 234.Palindrome Linked List

Given a singly linked list, determine if it is a palindrome. Follow up:Could you do it in O(n) time and O(1) space? 思想:转置后半段链表节点,然后比较前半段和后半段节点的值是否相等. 代码如下: /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next;