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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

[LeetCode] Palindrome Linked List

發布時間:2023/12/10 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [LeetCode] Palindrome Linked List 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Given a singly linked list, determine if it is a palindrome.

一開始想用棧,但是試來試去發現寫不出來遂放棄,后來想想再不濟可以轉換成數組然后分別兩頭掃,但是這樣就用了O(n) 的空間,再進一步,可不可以在鏈表里模擬呢。思前想后發現是可以的,只要把鏈表的頭尾接到一起形成個環,然后頭指針每次一動1步,尾指針每次移動 len - 1 步就行了,len 是鏈表的長度。

這樣我實現了算法1:

/*** Definition for singly-linked list.* function ListNode(val) {* this.val = val;* this.next = null;* }*/ /*** @param {ListNode} head* @return {boolean}*/ var isPalindrome = function(head) {if (!head) return true;var tail = head;var len = 0;while (tail && tail.next) {len++;tail = tail.next;}len++;tail.next = head;var ring = len;while (tail.val == head.val) {if (tail === head || ring === 0) return true;head = head.next;ring--;for (var i = 0; i < len - 1; i++) {tail = tail.next;}}return false; };

這個算法是正確的,但是很遺憾TLE 了。頭尾相接的做法其實是用取模運算的原理來模擬指針運動,可以運用相同原理適當改寫程序而避免頭尾相接,算法2:

/*** @param {ListNode} head* @return {boolean}*/ var isPalindrome = function(head) {if (!head) return true;var tail = head;var len = 0;while (tail && tail.next) {len++;tail = tail.next;}len++;var p1 = head;var p2 = head;var k = 1;for (var i = 0; i < len - k; i++) {p2 = p2.next;}while (p1 && p2 && p1.val == p2.val) {if (p1 === p2 || k == len) return true;k++;p2 = head;for (var i = 0; i < len - k; i++) {p2 = p2.next;}p1 = p1.next;}return false; };

算法1,2 的區別就是有卵用和沒卵用的區別,但是貌似頭尾相接要更簡潔一點,但是同樣是TLE。

后面看了些提示又想出一個土辦法:可以copy 一個鏈表出來然后反轉,然后兩個鏈表一起遍歷對比,算法3:

/*** Definition for singly-linked list.* function ListNode(val) {* this.val = val;* this.next = null;* }*/ /*** @param {ListNode} head* @return {boolean}*/ var reverseList = function(head) {if (!head) return null;var prev = null;var now = head;var next = head.nextwhile (now) {now.next = prev;prev = now;now = next;if (next) next = next.next;}return prev; };var copyList = function(head) {var p = new ListNode(-1);var c = p;while (head) {var n = new ListNode(head.val);c.next = n;c = n;head = head.next;}return p.next; }var isPalindrome = function(head) {if (!head) return true;var copy = copyList(head);var rev = reverseList(copy);var p = rev;var q = head;while (p && q) {if (p.val !== q.val) return false;p = p.next;q = q.next;}return true; };

這個是可以accept 的,但是是用了O(n) 額外空間,那么轉換成數組或者字符串兩頭掃八成也是可以通過的。

最后看了一些答案,發現雖然翻轉整個鏈表需要O(n)的額外空間,但是翻轉一半的話就不需要,那么只需要把原鏈表翻轉一半,然后兩頭掃就行,關鍵是怎么找到一半。

要么先掃一遍得到長度,再掃一遍取一半。但是有更簡潔的辦法可以一次遍歷就找出中點,就是快慢指針。設想一個指針按正常速度遍歷鏈表,另一個指針的速度是他的一半,那么當正常速度指針遍歷結束的時候,半速指針剛好在鏈表的中間,利用這個技巧找到鏈表中點,然后從中點開始翻轉,然后兩頭掃就可以。算法4:

/*** Definition for singly-linked list.* function ListNode(val) {* this.val = val;* this.next = null;* }*/ /*** @param {ListNode} head* @return {boolean}*/ var reverseList = function(head) {if (!head) return null;var prev = null;var now = head;var next = head.nextwhile (now) {now.next = prev;prev = now;now = next;if (next) next = next.next;}return prev; };var isPalindrome = function(head) {if (!head) return true;var fast = head;var slow = head;var m = 1;while (fast) {if (m === 0) {slow = slow.next;}m = (m + 1) % 2;fast = fast.next;}var tail = reverseList(slow);while (head && tail) {if (head.val !== tail.val) return false;head = head.next;tail = tail.next;}return true;};

利用一個整數變量m 來控制slow 指針的速度,fast 每走兩步,slow走一步。然后reverse 另一半,兩頭掃。整個過程還是很簡潔的,Accepted。

轉載于:https://www.cnblogs.com/agentgamer/p/4907848.html

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的[LeetCode] Palindrome Linked List的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 男女污污视频在线观看 | 国产99久久九九精品无码免费 | 国产精品九九九 | 综合激情婷婷 | 国产成人午夜 | 日本www高清| 成人在线三级 | 熟妇高潮一区二区三区在线播放 | 黄色一级片网站 | 手机在线一区二区 | 日本韩国欧美一区二区 | 一级毛片基地 | 99热热热热| 黄色视屏软件 | 欧美在线不卡视频 | 国产精彩视频在线观看 | 不卡av在线播放 | 国产男人天堂 | 欧美一级视频免费 | 成人在线视频免费看 | 国产一区导航 | 最近2018年手机中文字幕版 | av中文字幕免费观看 | 秋霞国产午夜精品免费视频 | 精品少妇av | 少妇精品无码一区二区免费视频 | 国产不卡视频在线观看 | 亚洲天堂一区二区在线 | 欧美性视频播放 | 亚洲精品1区2区3区 国产丝袜网站 | 欧美精品久久96人妻无码 | 24小时日本在线www免费的 | 正在播放国产一区 | 中文字幕欧美一区 | 精品人妻一区二区三 | 中文字幕在线观看一区二区 | 国产精品扒开腿做爽爽爽视频 | 性欧美ⅹxxxx极品护士 | 特大黑人娇小亚洲女 | 神马影院午夜伦理片 | 国产精品日韩电影 | 中文字幕欧美色图 | 天堂va蜜桃一区二区三区漫画版 | 亚洲国产综合视频 | 国产伦精品一区二区三区高清 | 色骚综合| 午夜寂寞福利 | 91老师国产黑色丝袜在线 | 女人私密又肥又大 | 色91精品久久久久久久久 | 艳妇臀荡乳欲伦交换h漫 | 日批网站在线观看 | 日本美女日批视频 | 国产一级做a爱免费视频 | 久久这里有精品 | 国产精品第一区 | 欧美jizz欧美性大全 | 成年人视频在线免费观看 | 高h喷水荡肉少妇爽多p视频 | 日韩精品视频在线免费观看 | 国产精品午夜福利视频234区 | 黄色片网站在线播放 | 国产美女主播在线 | 91视频a | 免费簧片在线观看 | 超碰在线免费观看97 | 日韩第一色 | 3o一40一50一6o女人毛片 | 欧美日韩成人一区 | 特级黄色大片 | 欧美福利在线视频 | 日产电影一区二区三区 | 天天做天天爱天天爽综合网 | 人人人人干 | 日韩精品1区2区3区 欧美一本 | 波多野结衣操 | 日日鲁鲁鲁夜夜爽爽狠狠视频97 | 福利电影在线播放 | av片在线观看 | 中文字幕在线乱 | 卡通动漫精品一区二区三区 | 人妻互换一区二区激情偷拍 | 狠狠人妻久久久久久综合蜜桃 | 欧美精品国产精品 | 欧美一级做性受免费大片免费 | 欧美色图第一页 | 国产成人免费看一级大黄 | 中文字幕av免费在线观看 | 羞羞答答一区 | 国产超碰人人模人人爽人人添 | 亚洲第一在线视频 | 色宗合| 欧美福利视频在线 | 视频一区二区国产 | 蜜桃av导航| 久久久网址 | 毛片基地在线播放 | av一区不卡| 国产精品一区二区免费 |