美文网首页
回文链表判断(leetcode234)

回文链表判断(leetcode234)

作者: zhouwaiqiang | 来源:发表于2018-11-13 13:29 被阅读0次

题目

  • 给定一个链表,判定它是否是回文链表
  • 举例:1->2返回false 1->2->2->1返回true
  • 时间复杂度O(n)空间复杂度O(1)

解析方法

  • 如果没有时间复杂度为O(n),空间复杂度O(1)的要求,那么这个解题方法很多,可以新建一个链表然后逆序比较两个链表是否相等即可得到结果,这样做时间复杂度O(n)空间复杂度O(n)
  • 采用二分的方法,先找到中间节点截断然后将后半部分逆序,前半部分和后半部分对比,如果完全相同那么后半部分遍历后的指向是null此时表示这个链表是回文,如果后半部分指针不是null那么表示循环提前结束了也就不是回文链表。

源代码实现

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public boolean isPalindrome(ListNode head) {
        ListNode slow = head, fast = head;
        while (fast != null && fast.next != null) {
            slow = slow.next;
            fast = fast.next.next;
        }
        if (fast != null) slow = slow.next;//奇数需要走到下一个才是后半部分的开头
        slow = reverse(slow);//将后半段列表反转
        while (slow != null && slow.val == head.val) {
            slow = slow.next;
            head = head.next;
        }
        return slow == null;
    }
    
    //反转方法1头插法,开销比较大
    private ListNode reverse(ListNode head) {
        ListNode front = new ListNode(0);
        while (head != null) {
            ListNode temp = head;
            head = head.next;
            temp.next = front.next;
            front.next = temp;
        }
        return front.next;
    }
    //反转方法二
    private ListNode reverse1(ListNode head) {
        ListNode pre = null;
        while (head != null) {
            ListNode next = head.next;
            head.next = pre;
            pre = head;
            head = next;
        }
        return pre;
    }
}

代码分析

  • 首先寻找中间节点所需时间是n/2,反转所需时间也是n/2,其次比较的时间也是需要n/2,所以整体时间是3n/2,所以时间复杂度是O(n),空间复杂度常数O(1)

相关文章

网友评论

      本文标题:回文链表判断(leetcode234)

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