日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

234. 回文链表

發布時間:2024/3/26 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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;}// 此時slow來到中點或者上中點的位置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. 回文链表的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。