LeetCode第234题,回文链表
题目:
请判断一个链表是否为回文链表。
示例 1:
输入: 1->2
输出: false
示例 2:
输入: 1->2->2->1
输出: true
进阶:
你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/palindrome-linked-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:快慢指针
如果这是一个线性数组而非链表,我们可以用两个指针一个指向数组头,一个指向数组尾来判断是否是回文。
面对这题,我们可以先将链表所有元素按顺序保存在一个数组中,然后按上面的思路做。但这样在空间上是O(n)的。所以我们可以考虑如何可以将链表由后往前遍历(将后半部分翻转)。
流程:
1.找到中间点。
2.翻转后半个链表
3.判断是否是回文
public boolean isPalindrome(ListNode head) {
// 用快慢指针找出中间点
ListNode slow = head, fast = head;
while(fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
}
// 将链表后半段翻转
fast = null;
while(slow != null) {
ListNode cur = slow.next;
slow.next = fast;
fast = slow;
slow = cur;
}
slow = head;
while(fast != null) {
if(slow.val != fast.val) return false; // 当链表不匹配时返回 false
slow = slow.next;
fast = fast.next;
}
return true;
}