生活随笔
收集整理的這篇文章主要介紹了
234. 回文链表
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1、題目描述
額外要求:你能否用 O(n) 時間復雜度和 O(1) 空間復雜度解決此題?
2、題解
2.1 解題思路1
使用額外的棧空間,先將鏈表中所有的元素依次壓入棧中,得到鏈表的逆序,然后將棧中的元素依次彈出和鏈表中的元素從頭到尾依次比較,如果發現不相等的元素,說明該鏈表不是回文鏈表,如果直到棧空,也沒發現不相等的元素,那么該鏈表是回文鏈表。
public static boolean isHuiWen01(ListNode head
) {if (head
== null) {return true;}Stack<Integer> stack
= new Stack<>();ListNode cur
= head
;while (cur
!= null) {stack
.push(cur
.val
);cur
= cur
.next
;}while (!stack
.isEmpty()) {if (stack
.pop() != head
.val
) {return false;}head
= head
.next
;}return true;}
這種思路,時間復雜度O(N),空間復雜度O(N)。
2.2 解題思路2
思路2也是逆序比較的想法,通過觀察可以得出,只需要將鏈表的后半部分元素逆序,然后和前半部分依次比較就可以得出鏈表是否是回文了。因此思路2和思路1的不同在于:
先找到鏈表的中點或者下中點,然后從中點(下中點)處依次將剩下的元素壓入棧中。依次彈出棧中元素和前半部分的鏈表元素依次比較,即可。
public static boolean isHuiWen02(ListNode head
) {if (head
== null) {return true;}ListNode fast
= head
;ListNode slow
= head
;while (fast
!= null && fast
.next
!= null) {fast
= fast
.next
.next
;slow
= slow
.next
;}Stack<Integer> stack
= new Stack<>();while (slow
!= null) {stack
.push(slow
.val
);slow
= slow
.next
;}while (!stack
.isEmpty()) {if (stack
.pop() != head
.val
) {return false;}head
= head
.next
;}return true;}
思路2的時間復雜度依然是O(N),空間復雜度也是O(N),但是系數是思路1的一半,減少了一半的棧空間。
2.3 解題思路3
思路3在思路2的基礎上,去掉了棧,采用原地反轉后半部分鏈表的思路,然后依次比較前半部分和后半部分的元素是否相等,具體來說:
首先找到鏈表的中點或者上中點mid,如何尋找鏈表中點可以參考這篇文章然后將mid.next及后面的鏈表部分反轉,同時將mid.next設置為null,這樣單鏈表就變為了如下形式
1->2->3->4->null
1->2->null
4->3->null
依次遍歷兩個鏈表,如果在遍歷過程中,發現了不等元素,說明鏈表不是回文,否則是回文
public static boolean isHuiWen03(ListNode head
) {if (head
== null) {return true;}ListNode fast
= head
;ListNode slow
= head
;while (fast
.next
!= null && fast
.next
.next
!= null) {fast
= fast
.next
.next
;slow
= slow
.next
;}ListNode slowPre
= slow
;slow
= slow
.next
;slowPre
.next
= null;slow
= reverse(slow
);ListNode cur
= slow
;while (cur
!= null && head
!= null) {if (cur
.val
!= head
.val
) {return false;}cur
= cur
.next
;head
= head
.next
;}slowPre
.next
= reverse(slow
);return true;}private static ListNode reverse(ListNode head
) {ListNode next
= null;ListNode pre
= null;while (head
!= null) {next
= head
.next
;head
.next
= pre
;pre
= head
;head
= next
;}return pre
;}
這種時間復雜度是O(N),空間復雜度是O(1),因為是原地反轉鏈表
3、提交結果
下面是最后一種的提交結果,當然可以選擇最后不復原鏈表,時間會更好一些
4、相關鏈接
Leetcode-回文鏈表題目鏈接
鏈表中點定位相關技巧博客
總結
以上是生活随笔為你收集整理的234. 回文链表的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。