Leetcode 234 回文鍊錶 高階

2022-08-02 18:24:10 字數 2909 閱讀 8829

請判斷乙個鍊錶是否為回文鍊錶。

示例 1:

輸入:1->2輸出:false
示例 2:

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

你能否用 o(n) 時間複雜度和 o(1) 空間複雜度解決此題?

遍歷一遍鍊錶壓棧,借助棧把鍊錶倒序,然後依次比較「原鍊錶元素」和「新棧中元素」,如果都相等則返回true,否則返回false。

這樣簡單粗暴,**的主體包含在解法二中了,這裡不列出了。

另外,這種解法的時間要求能不能通過leetcode的測試,我沒有試過,因為覺得沒必要試。

解題思路:使用兩個指標,fast和slow指標。

(1)fast指標每次走兩步slow指標每次走一步

(2)fast指標走到鍊錶末尾的時候,slow指標走到鍊錶的中間位置結點(鍊錶長度n為偶數)或中間位置的前乙個結點(鍊錶長度n為奇數);

(1)——>(2)——>(3)——>(2)——>(1)

slow fast

(1)——>(2)——>(3)——>(3)——>(2) ——> (1)

slow (fast)多走1步fast

(3)slow直接到了中間,就可以將整個鍊錶的後半部分壓棧實現逆序,依次和前半部分比較,思路同解法一。

注:就是在這裡,額外的時間複雜度減少了n/2,因為只需要將鍊錶中一半的元素壓棧。

其他的細節,**裡有詳細注釋。

/*

* * definition for singly-linked list.

* struct listnode

* }; */

static

const auto __ =() ();

class

solution

//

鍊錶長度為偶數,fast指標最後多走一步到鍊錶末尾if(fast->next)

fast = fast->next;

stack

s;//將鍊錶後半部分元素壓棧,通過棧來實現逆序

while(slow->next)

//依次比較前半部分元素和逆序的後半部分元素

while(!s.empty())

return

true

; }

};

解題思路:解法三和解法二的區別在於,最後不使用棧來倒序鍊錶後半部分的元素,而是選擇直接本地操作(額外空間複雜度為o(1)),在原鍊錶上將後半部分元素倒置(反轉),比較完後得出結果後,再 還原鍊錶,返回結果。

**中有詳細注釋。

/*

* * definition for singly-linked list.

* struct listnode

* }; */

static

const auto __ =() ();

class

solution

//鍊錶長度為偶數,fast指標最後多走一步到鍊錶末尾

if(fast->next)

fast = fast->next;

//-----區別在這裡,元素不壓棧,直接將鍊錶後半部分元素逆序,比較完後得出結果後,再還原鍊錶,返回結果--------

////

---------------鍊錶的後半部分元素「倒序」-------------------

// listnode* p = slow->next;

listnode* q =null;

listnode* cur =null;

slow->next =null;

while

(p)

//依次比較 前半部分元素 和 逆序的後半部分元素

while(1

)

slow->next =n;

return

false

; }

//前、後一起往後移動

fast = fast->next;

head = head->next;

//--------在這裡判斷結束,是除錯的結果----//

//針對這種情況:(3)——>(1)——>(2)——>(3),後半部分反轉之後的鍊錶是(3)——>(1)——>(3)——>(2)

// 如果使用while(head->next)作為結束,會少比較一次,也就是最後(1)和(2)不會比較到,從而出錯

if(fast ==null)

break;}

//鍊錶復原

listnode* m = q->next;

listnode* n =null;

listnode* cur2 =null;

q->next =null;

while

(m) slow->next =n;

return

true

; }

};

LeetCode 234 回文鍊錶

請判斷乙個鍊錶是否為回文鍊錶。definition for singly linked list.struct listnode bool ispalindrome struct listnode head 示例 1 輸入 1 2 輸出 false 示例 2 輸入 1 2 2 1 輸出 true 要...

leetcode 234 回文鍊錶

請判斷乙個鍊錶是否為回文鍊錶。示例 1 輸入 1 2輸出 false 示例 2 輸入 1 2 2 1輸出 true 解法1 使用棧 使用快慢指標找中點,原理是每次快指標走兩步,慢指標走一步,等快指標走完時,慢指標的位置就是中點。我們還需要用棧,每次慢指標走一步,都把值存入棧中,等到達中點時,鍊錶的前...

LeetCode 234 回文鍊錶

請判斷乙個鍊錶是否為回文鍊錶。解題思路 根據 o n 時間複雜度和 o 1 空間複雜度的要求,則不能使用堆疊。首先找到中間節點,然後反轉中間節點之後的節點,最後比較頭結點和中間節點之後元素的大小。bool solution ispalindrome listnode head 1.找到鍊錶的中間位置...