leetCode.234 - 回文链表

作者: 半亩房顶 | 来源:发表于2019-03-18 18:19 被阅读0次

    题目

    请判断一个链表是否为回文链表。
    示例 1:

    输入: 1->2
    输出: false
    

    示例 2:

    输入: 1->2->2->1
    输出: true
    

    进阶:
    你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?

    思路

    这个题目是简单难度,思路还是都有且挺多的
    新建一个反转链表作对比,使用栈等思路简单好想,但是空间复杂度是O(n),不满足进阶要求。
    不过站在大牛们的肩膀上找到了一个新的思路:
    快慢指针寻找中点,然后dummyHead + 头插法在O(1)空间复杂度上反转后半段,然后对比前半链和新的反转链。代码如下:

    代码

    function isPalindrome($head) {
            $centerNode = $doubleNode = $head;
            //快慢指针,定位中间位置
            while($doubleNode && $doubleNode->next){
                $centerNode = $centerNode->next;
                $doubleNode = $doubleNode->next->next;
            }
    
            //反转后半链表
            $dummyHead = new ListNode(null);
            //使用dummyHead则保证所有节点都有前置指针,更不容易出问题
            $mheadTmp = $centerNode;
            while($mheadTmp){
                $curNode = $mheadTmp;
                $mheadTmp = $mheadTmp->next;
                $curNode->next = $dummyHead->next;
                $dummyHead->next = $curNode;
            }
            
            $mhead = $dummyHead->next;
            $thead = $head;
            while($thead && $mhead){
                if($thead->val != $mhead->val){
                    return false;
                } else {
                    $thead = $thead->next;
                    $mhead = $mhead->next;
                }
            }
            return true;
        }
    

    欢迎大家关注我的公众号


    半亩房顶

    相关文章

      网友评论

        本文标题:leetCode.234 - 回文链表

        本文链接:https://www.haomeiwen.com/subject/owmbmqtx.html