判断一个链表是不是回文链表
获取链表的中点,根据快慢指针,将后半部分反转,然后从中点逐个比较。
- Runtime: 187 ms, faster than 68.01%
- Memory Usage: 74.7 MB, less than 22.36%
- 时间复杂度O(n),空间复杂度O(n)
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @return {boolean}
*/
var isPalindrome = function(head) {
let half = getHalf(head);
half.next = reverse(half.next);
let p1 = head;
let p2 = half.next;
while(p2) {
if(p1.val !== p2.val) {
return false;
}
p1 = p1.next;
p2 = p2.next;
}
return true;
};
var getHalf = function(node) {
let slow = node;
let fast = node;
while (fast.next && fast.next.next) {
slow = slow.next;
fast = fast.next.next;
}
return slow;
}
var reverse = function(node) {
let prev = null;
let cur = node;
while (cur) {
let tmp = cur.next;
cur.next = prev;
prev = cur;
cur = tmp;
}
return prev;
}
网友评论