LeetCode [链表] 234.Palindrome Linked List (C++和Python实现)

234.Palindrome Linked List [难度:简单]

【题目】

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

Example 1:

Input: 1->2
Output: false

Example 2:

Input: 1->2->2->1
Output: true

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

【解题C++】

要求O(n)的时间复杂度和O(1)的空间复杂度。也就是说不能开数组存值。由于链表不能逆着遍历,所以要想通过比较来判断回文与否,那就得先逆转。从哪里逆转是个问题,中点是肯定的。但如果像上道题也就是876题那样处理,会稍微麻烦一些。其实查找中点位置还可以通过快慢指针,和19题是一个思路。这里不需要n,只需要快指针走两步时慢指针走一步即可

这样看来,这道题的Follow up还是挺综合的,结合了链表逆转T206+中点查找T876(快慢指针T19)。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    bool isPalindrome(ListNode* head) {
        ListNode *fast,*slow;
        fast = slow = head;
        while(fast)
        {
        	//如果下一步不存在,说明已经到尾结点了 
        	if(fast->next)
        		fast = fast->next->next;
       		else fast = fast->next;
       		slow = slow->next;
        }
        //这里的slow其实不是中点,是我们需要逆转的第一个结点。
		//比如 1,2,3,4,5 slow指向的是4 
        ListNode* tmp = NULL,*re = NULL;
        //逆转链表 
        while(slow)
        {
        	tmp = slow->next;
        	slow->next = re;
        	re = slow;
        	slow = tmp;
        }
        //顺序比较 
        while(re&&head)
        {
        	if(head->val!=re->val)
        		return false;
       		head = head->next;
       		re = re->next;
        }
        return true;
    }
};

【解题Python版】 

思路同C++。

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def isPalindrome(self, head: ListNode) -> bool:
        fast = slow = head
        while fast != None:
            if fast.next is None:
                fast = fast.next
            else:
                fast = fast.next.next
            slow = slow.next
        newL = tmp = None
        while slow != None:
            tmp = slow.next
            slow.next = newL
            newL = slow
            slow = tmp
        while newL != None and head != None:
            if newL.val != head.val:
                return False
            newL = newL.next
            head = head.next
        return True
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值