拜託,面試別再問我回文鏈表了!!!(leetcode 234)

題目描述

請判斷一個鏈表是否爲迴文鏈表。git

示例1:github

輸入: 1->2
輸出: false

示例2:golang

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

進階:算法

你可否用 O(n) 時間複雜度和 O(1) 空間複雜度解決此題?數組

解題思路

思路1數據結構

  • 遍歷鏈表,用數組存下每一個節點的值,而後從數組兩頭開始向中間遍歷,是否相等
  • 時間複雜度O(n),空間複雜度O(n)

思路2app

  • 遍歷一遍鏈表,獲得鏈表長度n,根據長度的奇偶,找到中間節點,將左半邊的鏈表反轉,而後從中間節點分兩個方向向左右兩邊遍歷,是不是迴文;對左半部分鏈表進行反轉,還原爲最初的鏈表
  • 只須要固定的若干個臨時變量,不須要額外開闢空間
  • 時間複雜度爲O(n),空間複雜度爲O(1)

代碼實現

// ListNode Definition for singly-linked list.
type ListNode struct {
    Val  int
    Next *ListNode
}

// 解法1
// 用數組存前面的一半節點的值
// 時間複雜度:O(N)
// 空間複雜度:O(N)
func isPalindrome(head *ListNode) bool {
    // 空鏈表,算迴文
    if head == nil {
        return true
    }

    var data []int
    for cur := head; cur != nil; cur = cur.Next {
        data = append(data, cur.Val)
    }

    for i, j := 0, len(data)-1; i <= j; {
        if data[i] != data[j] {
            return false
        }
        i++
        j--
    }
    return true
}

// 解法2
// 找到鏈表中間節點,將前半部分轉置,再從中間向左右遍歷對比
// 時間複雜度:O(N)
// 空間複雜度:O(1)
func isPalindrome2(head *ListNode) bool {
    if head == nil || head.Next == nil {
        return true
    }
    isPalindrome := true

    //鏈表長度
    length := 0
    for cur := head; cur != nil; cur = cur.Next {
        length++
    }

    //將前半部分反轉
    step := length / 2
    var prev *ListNode
    cur := head
    for i := 1; i <= step; i++ {
        cur.Next, prev, cur = prev, cur, cur.Next
    }
    mid := cur

    var left, right *ListNode = prev, nil
    if length%2 == 0 {
        //長度爲偶數
        right = mid
    } else {
        right = mid.Next
    }

    //從中間向左右兩邊遍歷對比
    for left != nil && right != nil {
        if left.Val != right.Val {
            //值不相等,不是迴文鏈表
            isPalindrome = false
            break
        }
        left = left.Next
        right = right.Next
    }

    //將前半部分反轉的鏈表進行復原
    cur = prev
    prev = mid
    for cur != nil {
        cur.Next, prev, cur = prev, cur, cur.Next
    }

    return isPalindrome
}

GitHub

  • 源碼傳送門
  • 項目中會提供各類數據結構及算法的Golang實現, LeetCode解題思路及答案
題目來源

leetcode 234. 迴文鏈表code

相關文章
相關標籤/搜索