<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Linked List on 跟著 Desolve 學程式</title><link>https://desolve.pages.dev/tags/linked-list/</link><description>Recent content in Linked List on 跟著 Desolve 學程式</description><generator>Hugo -- gohugo.io</generator><language>zh-tw</language><lastBuildDate>Thu, 09 Jan 2020 00:00:00 +0800</lastBuildDate><atom:link href="https://desolve.pages.dev/tags/linked-list/index.xml" rel="self" type="application/rss+xml"/><item><title>從LeetCode學演算法 - 82 Linked List (10)</title><link>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-82-linked-list-10/</link><pubDate>Thu, 09 Jan 2020 00:00:00 +0800</pubDate><guid>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-82-linked-list-10/</guid><description>&lt;img src="https://desolve.pages.dev/img/default-leetcode.webp" alt="Featured image of post 從LeetCode學演算法 - 82 Linked List (10)" /&gt;&lt;p&gt;&lt;strong&gt;0086. Partition List (Medium)&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="寫在前面"&gt;寫在前面
&lt;/h2&gt;&lt;p&gt;再過兩天就是投票日了，懇請各位讀者們，&lt;br&gt;
不論支持誰，都要好好地去了解候選人們及政黨的政見，&lt;br&gt;
在1/11投下您寶貴的一票。**&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;筆者在這裡提醒大家去思考一下：&lt;br&gt;
程式的世界很單純，很多東西不是True就是False，&lt;br&gt;
而一個按照正常邏輯運行的程式，最終該呈現怎樣的結果，&lt;br&gt;
大抵都是可以預期的。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;想像一下，如果一個同事常常遲到早退，罔顧專案進度，&lt;br&gt;
讓大家必須要幫忙收拾爛攤子；&lt;br&gt;
話說的很滿，遇到事情卻推拖閃躲，&lt;br&gt;
顧左右而言他的話，相信這樣的人，&lt;br&gt;
我們不會希望其成為自己的頂頭上司。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;既然如此，我們會希望這種人成為自己的大老闆嗎？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;運用簡單的邏輯思考，相信聰明的各位都能得到正確答案。&lt;br&gt;
儘管這種人的餅畫得再大再漂亮，我們知道，&lt;br&gt;
那都不是真的，因為我們難以相信一個沒有誠信的人能夠說到做到。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="question"&gt;Question
&lt;/h2&gt;&lt;p&gt;Given a linked list and a value &lt;em&gt;x&lt;/em&gt;, partition it such that all nodes less than &lt;em&gt;x&lt;/em&gt; come before nodes greater than or equal to &lt;em&gt;x&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;You should preserve the original relative order of the nodes in each of the two partitions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input: head = 1-&amp;gt;4-&amp;gt;3-&amp;gt;2-&amp;gt;5-&amp;gt;2, x = 3
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: 1-&amp;gt;2-&amp;gt;2-&amp;gt;4-&amp;gt;3-&amp;gt;5
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="分析解題"&gt;分析/解題
&lt;/h3&gt;&lt;p&gt;給定一個Linked List和一個值x，使用x來將所有節點進行分段，&lt;br&gt;
令較x小的節點排在≥x的分段位置的前面。&lt;br&gt;
注意在分段時，同時也要保有原先兩段的節點順序。&lt;/p&gt;
&lt;p&gt;這題其實有點像是之前我們在講&lt;a class="link" href="https://medium.com/@desolution/%E5%BE%9Eleetcode%E5%AD%B8%E6%BC%94%E7%AE%97%E6%B3%95-4-6a631eb50da3" target="_blank" rel="noopener"
&gt;Merge Two Sorted Lists&lt;/a&gt;的感覺，&lt;br&gt;
為了要能夠讓兩個段落分開且照順序，&lt;br&gt;
我們應該要有兩個做為頭的&lt;strong&gt;dummy節點&lt;/strong&gt; ，稱為d1/d2。&lt;br&gt;
所有小於x的部分都接到d1，反之則接到d2。&lt;br&gt;
那麼實際上來說，我們只要將整個List遍歷過一遍，&lt;br&gt;
就可以依照&lt;strong&gt;實際和x之間的比較，來決定要將這次看到的節點&lt;/strong&gt; ，&lt;br&gt;
必須要接到d1還是d2上面。&lt;/p&gt;
&lt;p&gt;由於最後我們需要將兩段接起來，&lt;br&gt;
所以d1/d2保持不動的狀況下，&lt;br&gt;
我們需要另一個變數來&lt;strong&gt;儲存現在遍歷的部份走到的節點，&lt;br&gt;
先稱其為ite1/ite2，所以ite1/ite2起始分別是d1/d2。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;那麼，按照邏輯來說，我們可以能會想到下面的寫法：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;if (head.val &amp;lt; x) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 　ite1.next = head;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 　ite1 = ite1.next;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;但這麼考慮欠缺了一個條件：&lt;br&gt;
&lt;strong&gt;當我們選定ite1.next = head時，head裡面還藏有它的next的資訊&lt;/strong&gt; ，&lt;br&gt;
造成你以為是只有納入head，&lt;strong&gt;殊不知head.next也被隱含進去了&lt;/strong&gt; ！&lt;br&gt;
要解決這個問題，我們可以&lt;strong&gt;將ite1.next重新設為null&lt;/strong&gt; 。&lt;br&gt;
問題來了，這一設為null，反而變成&lt;strong&gt;head的資訊就消失了&lt;/strong&gt; ，&lt;br&gt;
&lt;strong&gt;同時head.next的資訊也消失了&lt;/strong&gt; 。&lt;/p&gt;
&lt;p&gt;所以，我們要一開始用一個nxt的ListNode來記錄head.next，&lt;br&gt;
接下來兩種狀況下的next相關操作做完以後，&lt;br&gt;
&lt;strong&gt;最後再讓head接上先前儲存的nxt。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;依此，寫成程式碼。&lt;/p&gt;
&lt;h3 id="java"&gt;Java
&lt;/h3&gt;&lt;p&gt;Java的部分，我們先用直觀的方式來處理，&lt;br&gt;
所以包含前面的處理都完整的話，&lt;br&gt;
我們應該能得到&lt;strong&gt;d1及其後面的一組(直到ite1)、&lt;br&gt;
d2及其後面的另一組(直到ite2)&lt;/strong&gt;，&lt;br&gt;
若其中一個沒有接上任何節點的話，&lt;br&gt;
可以&lt;strong&gt;直接吐出d1.next/d2.next&lt;/strong&gt; 的狀況。&lt;br&gt;
若兩者皆有，則&lt;strong&gt;先將第一排的結尾接給第二排的開頭&lt;/strong&gt; ，&lt;br&gt;
最後回傳d1.next即可。&lt;/p&gt;
&lt;p&gt;同時，運用陣列可以更輕鬆地化簡邏輯，&lt;br&gt;
這裡將改善過後的版本放在註解欄中。&lt;/p&gt;
&lt;script src="https://gist.github.com/Desolve/a4bf11639b8cd187f52e0d455277fe02.js"&gt;&lt;/script&gt;
&lt;h3 id="python"&gt;Python
&lt;/h3&gt;&lt;p&gt;就Python的部分而言，只要使用跟前述相近的處理方式，&lt;br&gt;
&lt;strong&gt;最後再回傳d1.next&lt;/strong&gt; 即可。&lt;/p&gt;
&lt;script src="https://gist.github.com/Desolve/ba6d096a47b698a49714560a9c591f88.js"&gt;&lt;/script&gt;
&lt;h2 id="面試實際可能會遇到的問題"&gt;面試實際可能會遇到的問題
&lt;/h2&gt;&lt;p&gt;「時間/空間複雜度？」&lt;br&gt;
(O(N)/O(1))&lt;/p&gt;
&lt;h2 id="相似及延伸"&gt;相似及延伸
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Special Thanks suggestions/corrections from viewers:&lt;br&gt;
(歡迎提供意見協助更正歐~)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;從LeetCode學演算法，我們下次見囉，掰~&lt;/p&gt;
&lt;p&gt;感謝大家對這系列文章的支持！這邊跟大家自我工商一下：&lt;/p&gt;
&lt;p&gt;筆者開設的系列同名線上課程：&lt;br&gt;
&lt;strong&gt;「從Leetcode學演算法｜基礎篇」已經上線啦！&lt;/strong&gt; 在這堂課中，你將學會利用十種演算法/資料結構來優化解題過程，&lt;br&gt;
並實際完整練習&lt;strong&gt;20題&lt;/strong&gt; 精選考古題，&lt;br&gt;
進而逐漸提升到不需提示也可以突破白板題，取得工作門票！&lt;br&gt;
&lt;strong&gt;Medium優惠(最後一波早鳥優惠了，不確定調回原價是什麼時候)：&lt;/strong&gt; &lt;a class="link" href="https://hiskio.com/courses/319?promo_code=VEQZV7E" target="_blank" rel="noopener"
&gt;** https://hiskio.com/courses/319?promo_code=VEQZV7E**&lt;/a&gt;&lt;/p&gt;</description></item><item><title>從LeetCode學演算法 - 80 Linked List (9)</title><link>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-80-linked-list-9/</link><pubDate>Sat, 04 Jan 2020 00:00:00 +0800</pubDate><guid>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-80-linked-list-9/</guid><description>&lt;img src="https://desolve.pages.dev/img/default-leetcode.webp" alt="Featured image of post 從LeetCode學演算法 - 80 Linked List (9)" /&gt;&lt;p&gt;&lt;strong&gt;0082. Remove Duplicates from Sorted List II (Medium)&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="question"&gt;Question
&lt;/h2&gt;&lt;p&gt;Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only &lt;em&gt;distinct&lt;/em&gt; numbers from the original list.&lt;/p&gt;
&lt;h3 id="example-1"&gt;Example 1
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input: 1-&amp;gt;2-&amp;gt;3-&amp;gt;3-&amp;gt;4-&amp;gt;4-&amp;gt;5
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: 1-&amp;gt;2-&amp;gt;5
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="example-2"&gt;Example 2
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input: 1-&amp;gt;1-&amp;gt;1-&amp;gt;2-&amp;gt;3
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: 2-&amp;gt;3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="分析解題"&gt;分析/解題
&lt;/h3&gt;&lt;p&gt;給定一個排序好的鏈結串列，將擁有重複的數字的節點全數刪去，&lt;br&gt;
只保留原先在串列上相異的數字。&lt;/p&gt;
&lt;p&gt;我們之前就嘗試過&lt;a class="link" href="https://medium.com/@desolution/%E5%BE%9Eleetcode%E5%AD%B8%E6%BC%94%E7%AE%97%E6%B3%95-10-linked-list-2-8384845e8ad6" target="_blank" rel="noopener"
&gt;&lt;strong&gt;從鏈結串列刪去節點&lt;/strong&gt; &lt;/a&gt;的題目了，&lt;br&gt;
只是今天這組更激進一點XD&lt;br&gt;
原本是刪到剩一個即可，現在變成要將重複的全都刪掉，&lt;br&gt;
那麼，該怎麼辦呢？&lt;/p&gt;
&lt;p&gt;由於有可能刪到第一個，一般來說這種狀況，&lt;br&gt;
習慣上會開出一個dummy node做為不會變動的節點參照，&lt;br&gt;
我們先將其叫做dum，簡單將dum的next連接至head即可。&lt;/p&gt;
&lt;p&gt;接下來要處理的是：我們要記得&lt;strong&gt;數值一致的節點群前面的那一個節點&lt;/strong&gt; ，&lt;br&gt;
這樣刪去的時候才能將前後重新連接上。&lt;br&gt;
因此，我們需要一個節點記錄，這裡將它叫做&lt;strong&gt;pre&lt;/strong&gt; ；&lt;br&gt;
另一個節點則做為迭代用，記錄現在所在的位置，將其稱做&lt;strong&gt;cur&lt;/strong&gt; ，且就位置關係來說，&lt;strong&gt;pre的next應該會是cur&lt;/strong&gt; 。&lt;br&gt;
開始時&lt;strong&gt;pre的起始點&lt;/strong&gt; 應該是&lt;strong&gt;dum&lt;/strong&gt; ，這樣&lt;strong&gt;cur&lt;/strong&gt; 會從&lt;strong&gt;head&lt;/strong&gt; 開始，&lt;br&gt;
&lt;strong&gt;當cur還沒走到底的時候要進行迴圈遍歷&lt;/strong&gt; 。&lt;br&gt;
另外在內部&lt;strong&gt;每次要迴圈檢查&lt;/strong&gt; ：&lt;br&gt;
&lt;strong&gt;1. cur是否有下一個節點&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;且&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;2. cur的下一個節點和自己的值是否相等&lt;/strong&gt;&lt;br&gt;
(和先前一樣，這個迴圈用來&lt;strong&gt;略過所有重複值的節點&lt;/strong&gt; )&lt;/p&gt;
&lt;p&gt;當走完以後有可能是&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;cur還沒到底(有值)&lt;/strong&gt; =&amp;gt; &lt;br&gt;
&lt;strong&gt;pre的next就是cur&lt;/strong&gt; ，所以再往下找的話要將&lt;strong&gt;pre設為pre.next&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cur已經碰到底了&lt;/strong&gt; (cur.next == null) =&amp;gt;&lt;br&gt;
將&lt;strong&gt;pre.next指向null&lt;/strong&gt; (pre.next = cur.next)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;最後，別忘了&lt;strong&gt;將cur往下走(cur = cur.next)&lt;/strong&gt; 。&lt;br&gt;
最終做完的時候，由於先前我們&lt;strong&gt;將dum.next設定成head&lt;/strong&gt; ，&lt;br&gt;
中間連接有變動的話，會被pre的操作給連接過去，&lt;br&gt;
&lt;strong&gt;所以新的head的位置不管有無更動，&lt;br&gt;
應該還是位於dum.next上。&lt;/strong&gt;&lt;br&gt;
(&lt;strong&gt;因為pre一開始等於dum，pre.next一開始會連動到dum.next&lt;/strong&gt; )&lt;/p&gt;
&lt;p&gt;依此，寫成程式碼。&lt;/p&gt;
&lt;h3 id="java"&gt;Java
&lt;/h3&gt;&lt;p&gt;Java的部分不要忘記該new的dum，&lt;br&gt;
剩下就只有判斷null的時候不像Python可以直接用if not，&lt;br&gt;
其他大多大同小異；Python的邏輯是一致的，就不再贅述說明了。&lt;/p&gt;
&lt;script src="https://gist.github.com/Desolve/6e999e9f0ca340173be77592141b0a94.js"&gt;&lt;/script&gt;
&lt;h3 id="python"&gt;Python
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/0f125ecd017b73b7ac5501941b00976e.js"&gt;&lt;/script&gt;
&lt;h2 id="面試實際可能會遇到的問題"&gt;面試實際可能會遇到的問題
&lt;/h2&gt;&lt;p&gt;「時間/空間複雜度？」&lt;br&gt;
(O(N)/O(1))&lt;/p&gt;
&lt;h2 id="相似及延伸"&gt;相似及延伸
&lt;/h2&gt;&lt;p&gt;這題理論上也可以用遞迴的方法解，有興趣的讀者可以嘗試看看。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Special Thanks suggestions/corrections from viewers:&lt;br&gt;
(歡迎提供意見協助更正歐~)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;從LeetCode學演算法，我們下次見囉，掰~&lt;/p&gt;
&lt;p&gt;感謝大家對這系列文章的支持！這邊跟大家自我工商一下：&lt;/p&gt;
&lt;p&gt;筆者開設的系列同名線上課程：&lt;br&gt;
&lt;strong&gt;「從Leetcode學演算法｜基礎篇」已經上線啦！&lt;/strong&gt; 在這堂課中，你將學會利用十種演算法/資料結構來優化解題過程，&lt;br&gt;
並實際完整練習&lt;strong&gt;20題&lt;/strong&gt; 精選考古題，&lt;br&gt;
進而逐漸提升到不需提示也可以突破白板題，取得工作門票！&lt;br&gt;
&lt;strong&gt;Medium優惠(最後一波早鳥優惠了，不確定調回原價是什麼時候)：&lt;/strong&gt; &lt;a class="link" href="https://hiskio.com/courses/319?promo_code=VEQZV7E" target="_blank" rel="noopener"
&gt;** https://hiskio.com/courses/319?promo_code=VEQZV7E**&lt;/a&gt;&lt;/p&gt;</description></item><item><title>從LeetCode學演算法 - 74 Linked List (8)</title><link>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-74-linked-list-8/</link><pubDate>Mon, 16 Dec 2019 00:00:00 +0800</pubDate><guid>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-74-linked-list-8/</guid><description>&lt;img src="https://desolve.pages.dev/img/default-leetcode.webp" alt="Featured image of post 從LeetCode學演算法 - 74 Linked List (8)" /&gt;&lt;p&gt;&lt;strong&gt;0234. Palindrome Linked List (Easy)&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="question"&gt;Question
&lt;/h2&gt;&lt;p&gt;Given a singly linked list, determine if it is a palindrome.&lt;/p&gt;
&lt;h3 id="example-1"&gt;Example 1
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input: 1-&amp;gt;2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: false
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="example-2"&gt;Example 2
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input: 1-&amp;gt;2-&amp;gt;2-&amp;gt;1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: true
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Follow up:&lt;/strong&gt;&lt;br&gt;
Could you do it in O(n) time and O(1) space?&lt;/p&gt;
&lt;h3 id="分析解題"&gt;分析/解題
&lt;/h3&gt;&lt;p&gt;給定一個單向鏈結串列，試判斷它是否是palindrome(回文)。&lt;br&gt;
所謂palindrome就是&lt;strong&gt;從尾到頭和從頭到尾看起來會相同&lt;/strong&gt; 。&lt;br&gt;
在這題當中，由於我們的結構是Linked List，無法很輕鬆的到達尾端，&lt;br&gt;
也無法輕易的回頭，那麼該怎麼辦呢？&lt;br&gt;
要判斷回文有一個重點，就是&lt;strong&gt;從中間切開來兩邊是對稱的&lt;/strong&gt; 。&lt;br&gt;
因此，我們可以設定fast/slow的兩個pointer，&lt;br&gt;
以之前常用的技巧，&lt;strong&gt;每次fast走兩步，slow走一步&lt;/strong&gt; ；&lt;br&gt;
&lt;strong&gt;讓fast走到底時，slow剛好走到一半&lt;/strong&gt; 。&lt;br&gt;
節點總數是偶數時，切開來的第二段應該是從&lt;strong&gt;slow的下一個節點&lt;/strong&gt; 開始，&lt;br&gt;
所以&lt;strong&gt;當fast不是NIL&lt;/strong&gt; 時，我們應該&lt;strong&gt;讓slow多走一步&lt;/strong&gt; 。&lt;br&gt;
(例如總共有10個節點，按上面的方法走完，&lt;br&gt;
fast會在10，slow會在5，但第二段應該從6開始，所以slow要往下走一步)&lt;/p&gt;
&lt;p&gt;所以比較「&lt;strong&gt;從slow到串列尾端的反轉串列&lt;/strong&gt; 」及&lt;br&gt;
「&lt;strong&gt;從head往下的對應節點&lt;/strong&gt; 」，即可檢驗串列是否為回文。&lt;/p&gt;
&lt;p&gt;那麼要怎麼反轉串列呢？&lt;a class="link" href="https://medium.com/@desolution/%E5%BE%9Eleetcode%E5%AD%B8%E6%BC%94%E7%AE%97%E6%B3%95-72-linked-list-7-419253aa3a9a" target="_blank" rel="noopener"
&gt;&lt;strong&gt;上上篇文章&lt;/strong&gt; &lt;/a&gt;不就是嗎XD&lt;br&gt;
我們可以用之前的reverse函數進行反轉，&lt;br&gt;
反轉後再對兩個串列一一進行比較，&lt;br&gt;
一旦值不相等即回傳false。&lt;/p&gt;
&lt;p&gt;依此，寫成程式碼如下：&lt;/p&gt;
&lt;h3 id="java"&gt;Java
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/6be1259696a5d491b8f8577daac86c53.js"&gt;&lt;/script&gt;
&lt;p&gt;我們也可以使用另一種思路，&lt;br&gt;
先多設定一個rev節點，&lt;br&gt;
在slow/fast行進時，將slow經過節點進行反轉連接，&lt;br&gt;
這樣在走完的時候，讓&lt;strong&gt;rev&lt;/strong&gt; 變成&lt;strong&gt;前半段反轉後的串列的開頭&lt;/strong&gt; ，&lt;br&gt;
而&lt;strong&gt;slow&lt;/strong&gt; 則是&lt;strong&gt;後半段的串列的開頭&lt;/strong&gt; 。最後同樣一個一個檢查，&lt;br&gt;
即可判斷整個串列是否是回文。&lt;/p&gt;
&lt;h3 id="python"&gt;Python
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/4e3c298a79a619e991c7abdcb75bad36.js"&gt;&lt;/script&gt;
&lt;p&gt;務必請留意這麼做的缺點是&lt;strong&gt;整個串列就被我們拆成兩半了&lt;/strong&gt; ，&lt;br&gt;
如果不是要求空間複雜度是O(1)的話，&lt;br&gt;
用別的資料結構輔助去存入一半的節點，能夠保有原先的結構。&lt;/p&gt;
&lt;h2 id="面試實際可能會遇到的問題"&gt;面試實際可能會遇到的問題
&lt;/h2&gt;&lt;p&gt;「時間/空間複雜度？」&lt;br&gt;
(O(N)/O(1))&lt;/p&gt;
&lt;p&gt;「如果不計較空間複雜度，有沒有辦法保留原先的linked list呢？」&lt;br&gt;
(Python的話可以使用list來做兩邊儲存比較的動作，&lt;br&gt;
或者要使用stack來置入前半段的節點，後面pop出來做比較也可以)&lt;/p&gt;
&lt;h2 id="相似及延伸"&gt;相似及延伸
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Special Thanks suggestions/corrections from viewers:&lt;br&gt;
(歡迎提供意見協助更正歐~)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;從LeetCode學演算法，我們下次見囉，掰~&lt;/p&gt;
&lt;p&gt;感謝大家對這系列文章的支持！這邊跟大家自我工商一下：&lt;/p&gt;
&lt;p&gt;筆者開設的系列同名線上課程：&lt;br&gt;
&lt;strong&gt;「從Leetcode學演算法｜基礎篇」已經上線啦！&lt;/strong&gt; 在這堂課中，你將學會利用十種演算法/資料結構來優化解題過程，&lt;br&gt;
並實際完整練習&lt;strong&gt;20題&lt;/strong&gt; 精選考古題，&lt;br&gt;
進而逐漸提升到不需提示也可以突破白板題，取得工作門票！&lt;br&gt;
&lt;strong&gt;Medium限額5名優惠(額滿即截止)：&lt;/strong&gt; &lt;a class="link" href="https://hiskio.com/courses/319?promo_code=VE9NJQE" target="_blank" rel="noopener"
&gt;&lt;strong&gt;https://hiskio.com/courses/319?promo_code=VE9NJQE&lt;/strong&gt; &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;問卷抽書＆取得上架通知：&lt;/strong&gt; &lt;a class="link" href="https://pse.is/MS2J2?fbclid=IwAR2PMTGbMG-8qh2eq-kfGoolRWWYMPcEXdOa1Bib_pFFUaPlTlGb3UYAeDw" target="_blank" rel="noopener"
&gt;&lt;strong&gt;https://pse.is/MS2J2&lt;/strong&gt; &lt;/a&gt;&lt;br&gt;
如果你對線上課程不放心，&lt;br&gt;
也可以先來&lt;strong&gt;12/17(二)&lt;/strong&gt; 我在天瓏分享的講座看看！&lt;br&gt;
&lt;strong&gt;講座連結：&lt;/strong&gt; &lt;a class="link" href="https://pse.is/JS3LJ?fbclid=IwAR2j615ajqdqNsNHWTST4JnlCdbQzQecNaZG9LV7J55VFnw8ufLWojrk7iw" target="_blank" rel="noopener"
&gt;&lt;strong&gt;https://pse.is/JS3LJ&lt;/strong&gt; &lt;/a&gt;&lt;/p&gt;</description></item><item><title>從LeetCode學演算法 - 72 Linked List (7)</title><link>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-72-linked-list-7/</link><pubDate>Mon, 02 Dec 2019 00:00:00 +0800</pubDate><guid>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-72-linked-list-7/</guid><description>&lt;img src="https://desolve.pages.dev/img/default-leetcode.webp" alt="Featured image of post 從LeetCode學演算法 - 72 Linked List (7)" /&gt;&lt;p&gt;&lt;strong&gt;0206. Reverse Linked List (Easy)&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="question"&gt;Question
&lt;/h2&gt;&lt;p&gt;Reverse a singly linked list.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input: 1-&amp;gt;2-&amp;gt;3-&amp;gt;4-&amp;gt;5-&amp;gt;NULL
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: 5-&amp;gt;4-&amp;gt;3-&amp;gt;2-&amp;gt;1-&amp;gt;NULL
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="分析解題"&gt;分析/解題
&lt;/h3&gt;&lt;p&gt;試反轉一個單向鏈結串列。&lt;br&gt;
很久以前我們嘗試解過這題的&lt;a class="link" href="https://medium.com/@desolution/%E5%BE%9Eleetcode%E5%AD%B8%E6%BC%94%E7%AE%97%E6%B3%95-12-linked-list-3-stack-1-f99d18e539a9" target="_blank" rel="noopener"
&gt;較困難的版本&lt;/a&gt;&lt;br&gt;
(0092. Reverse Linked List II (Medium))，&lt;br&gt;
不過是透過stack的輔助，這題較為簡單，&lt;br&gt;
我們來嘗試不使用其他資料結構來試試看吧XD！&lt;/p&gt;
&lt;p&gt;先舉一個簡單的例子：&lt;br&gt;
head -&amp;gt; a -&amp;gt; b -&amp;gt; c -&amp;gt; d -&amp;gt; &lt;strong&gt;NIL&lt;/strong&gt;&lt;br&gt;
這個單向鏈結串列在反轉的時候應該會變成 ：&lt;br&gt;
&lt;strong&gt;NIL&lt;/strong&gt; &amp;lt;- head &amp;lt;- a &amp;lt;- b &amp;lt;- c &amp;lt;- d&lt;/p&gt;
&lt;p&gt;我們可以先看head, a, b這段，&lt;br&gt;
在反轉時，我們要將head的next從a改成別的指向；&lt;br&gt;
但如果先改掉的話，那就喪失掉a的位置了，&lt;br&gt;
所以我們需要一個tmp來記錄a的位置，&lt;br&gt;
再將head的next指向到&lt;strong&gt;前一個node&lt;/strong&gt; (這邊一開始是NIL)，&lt;br&gt;
最後讓tmp這個node做為下一個要處理的對象。&lt;br&gt;
反覆處理，最終當head是null的時候，&lt;br&gt;
回傳前一個node即為新的linked list的開頭(反轉前的尾端)。&lt;/p&gt;
&lt;p&gt;所以以迭代法的步驟上會像這樣：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;先宣告一個NIL的ListNode，我們命名為prev&lt;/li&gt;
&lt;li&gt;當head非null時，進行迴圈：&lt;br&gt;
2-1. 宣告一個節點n，位置指定到head的位置&lt;br&gt;
2-2. head往下走到其next&lt;br&gt;
2-3. n的next位置指定成prev&lt;br&gt;
2-4. 再將prev的位置指定到n&lt;/li&gt;
&lt;li&gt;迴圈完成後回傳prev即可&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;1. (prev=NIL) head -&amp;gt; a -&amp;gt; b ...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2. (n)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (prev=NIL) head -&amp;gt; a -&amp;gt; b ...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2-3 (head)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; prev=NIL &amp;lt;- n a -&amp;gt; b ...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;2-4 NIL &amp;lt;- prev head=a -&amp;gt; b ...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;以第一輪的迴圈推導會如上面，讀者也可以自行嘗試推演看看。&lt;/p&gt;
&lt;p&gt;若用遞迴的話也可以達到相同效果：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;呼叫一個遞迴函式rev，將(null, head)做為參數傳入&lt;br&gt;
(在rev中，參數為前一個節點prev，跟當前的節點n)&lt;/li&gt;
&lt;li&gt;如果n為NIL的話則直接回傳prev&lt;/li&gt;
&lt;li&gt;宣告一個tmp節點，其位置指定為n.next&lt;/li&gt;
&lt;li&gt;再將n.next的位置指定給prev&lt;/li&gt;
&lt;li&gt;回傳rev(n, tmp)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;所以不論哪一種方式，&lt;br&gt;
我們基本上都是使用宣告的節點去記錄next的部分，&lt;br&gt;
再將當前的節點的next指向到prev，從而完成將鏈結反向的工作。&lt;/p&gt;
&lt;p&gt;依此，寫成如下的程式碼：&lt;/p&gt;
&lt;h3 id="java"&gt;Java
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/fe21838dc9ef718839d2b367d29ba70d.js"&gt;&lt;/script&gt;
&lt;h3 id="python"&gt;Python
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/8206dc3b2d7f01acda91359968541054.js"&gt;&lt;/script&gt;
&lt;h2 id="面試實際可能會遇到的問題"&gt;面試實際可能會遇到的問題
&lt;/h2&gt;&lt;p&gt;「時間/空間複雜度？」&lt;br&gt;
(O(N)/O(1))&lt;/p&gt;
&lt;h2 id="相似及延伸"&gt;相似及延伸
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Special Thanks suggestions/corrections from viewers:&lt;br&gt;
(歡迎提供意見協助更正歐~)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;從LeetCode學演算法，我們下次見囉，掰~&lt;/p&gt;
&lt;p&gt;感謝大家對這系列文章的支持！這邊跟大家自我工商一下：&lt;/p&gt;
&lt;p&gt;筆者開設的系列同名線上課程：&lt;br&gt;
&lt;strong&gt;「從Leetcode學演算法｜基礎篇」已經上線啦！&lt;/strong&gt; 在這堂課中，你將學會利用十種演算法/資料結構來優化解題過程，&lt;br&gt;
並實際完整練習&lt;strong&gt;20題&lt;/strong&gt; 精選考古題，&lt;br&gt;
進而逐漸提升到不需提示也可以突破白板題，取得工作門票！&lt;br&gt;
&lt;strong&gt;Medium限額5名優惠(額滿即截止)：&lt;/strong&gt; &lt;a class="link" href="https://hiskio.com/courses/319?promo_code=VE9NJQE" target="_blank" rel="noopener"
&gt;&lt;strong&gt;https://hiskio.com/courses/319?promo_code=VE9NJQE&lt;/strong&gt; &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;問卷抽書＆取得上架通知：&lt;/strong&gt; &lt;a class="link" href="https://pse.is/MS2J2?fbclid=IwAR2PMTGbMG-8qh2eq-kfGoolRWWYMPcEXdOa1Bib_pFFUaPlTlGb3UYAeDw" target="_blank" rel="noopener"
&gt;&lt;strong&gt;https://pse.is/MS2J2&lt;/strong&gt; &lt;/a&gt;&lt;br&gt;
如果你對線上課程不放心，&lt;br&gt;
也可以先來&lt;strong&gt;12/17(二)&lt;/strong&gt; 我在天瓏分享的講座看看！&lt;br&gt;
&lt;strong&gt;講座連結：&lt;/strong&gt; &lt;a class="link" href="https://pse.is/JS3LJ?fbclid=IwAR2j615ajqdqNsNHWTST4JnlCdbQzQecNaZG9LV7J55VFnw8ufLWojrk7iw" target="_blank" rel="noopener"
&gt;&lt;strong&gt;https://pse.is/JS3LJ&lt;/strong&gt; &lt;/a&gt;&lt;/p&gt;</description></item><item><title>從LeetCode學演算法 - 70 Linked List (6)</title><link>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-70-linked-list-6/</link><pubDate>Wed, 20 Nov 2019 00:00:00 +0800</pubDate><guid>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-70-linked-list-6/</guid><description>&lt;img src="https://desolve.pages.dev/img/default-leetcode.webp" alt="Featured image of post 從LeetCode學演算法 - 70 Linked List (6)" /&gt;&lt;p&gt;&lt;strong&gt;0203. Remove Linked List Elements (Easy)&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="question"&gt;Question
&lt;/h2&gt;&lt;p&gt;Remove all elements from a linked list of integers that have value *&lt;strong&gt;val&lt;/strong&gt; *.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input: 1-&amp;gt;2-&amp;gt;6-&amp;gt;3-&amp;gt;4-&amp;gt;5-&amp;gt;6, val = 6
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: 1-&amp;gt;2-&amp;gt;3-&amp;gt;4-&amp;gt;5
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="分析解題"&gt;分析/解題
&lt;/h3&gt;&lt;p&gt;題目要求將一個給定的linked list上值是val的所有元素均去除掉。&lt;/p&gt;
&lt;p&gt;前面已經講過一些linked list的題目了，&lt;br&gt;
在處理的重點上，不外乎就是在於如何進行&lt;strong&gt;遍歷&lt;/strong&gt; ，&lt;br&gt;
以及&lt;strong&gt;移動&lt;/strong&gt; 和&lt;strong&gt;取代&lt;/strong&gt; 的不同，是很多人容易弄混的。&lt;/p&gt;
&lt;p&gt;我們先假定有一組node的連結長這樣：&lt;br&gt;
prev -&amp;gt; curr -&amp;gt; next&lt;/p&gt;
&lt;p&gt;今天如果想要遍歷的話，我們應該做的事情是先宣告一個node，&lt;br&gt;
並將prev的位置指定給node：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Java:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ListNode node = prev;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;while (node != null) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.out.println(node.val);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; node = node.next;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Python:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;node = prev
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;while node:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; print(node.val)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; node = node.next
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;這當中，node = node.next的方式變動了node所指向的記憶體位址，&lt;br&gt;
使其切換到下一個(也就是curr所在的位址)，但&lt;strong&gt;prev仍然在原地&lt;/strong&gt; 。&lt;/p&gt;
&lt;p&gt;回歸到題目本身，&lt;br&gt;
題目要求的是跳過特定的val值，例如1-&amp;gt;2-&amp;gt;6-&amp;gt;3，目標val是6。&lt;br&gt;
遇到val值時，應該要&lt;strong&gt;將2的連接從6改到3&lt;/strong&gt; ，換言之，&lt;br&gt;
當結點node走到2時，發現node.next.val跟目標val一樣，&lt;br&gt;
連接上就會變成：&lt;br&gt;
&lt;strong&gt;node.next = node.next.next&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;此外，為了要進行遍歷，所以每次node都需要往下一個前進，&lt;br&gt;
在前一個狀況下已經確定了會將node.next接到node.next.next去了，&lt;br&gt;
若val不同的話，則需要&lt;strong&gt;將node的位置移到下一個&lt;/strong&gt; 去：&lt;br&gt;
&lt;strong&gt;node = node.next&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;還有一個問題，就是如果一開頭的値就符合val的話，&lt;br&gt;
刪去頭會導致原先的head消失，&lt;br&gt;
為了避免麻煩，常見的做法是宣告一個dummy node，將其連接到head處。&lt;br&gt;
中間不論如何都不去動dummy，結尾時再將&lt;strong&gt;dummy.next&lt;/strong&gt; 回傳即可。&lt;/p&gt;
&lt;p&gt;Java的部分，我們初始化一個dummy node並另開一個curr來進行移動。&lt;br&gt;
**每次curr.next的値符合時，就將curr.next接到curr.next.next，&lt;br&gt;
否則就讓curr往下走。**這麼一來，只要不斷檢查curr.next是否為NIL並遞進即可。&lt;/p&gt;
&lt;h3 id="java"&gt;Java
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/f0cabb97c31bad564895f48456753d03.js"&gt;&lt;/script&gt;
&lt;p&gt;Python的部分大同小異。&lt;/p&gt;
&lt;h3 id="python"&gt;Python
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/af26f72283e8e9d2c07ed134929ec03d.js"&gt;&lt;/script&gt;
&lt;h2 id="面試實際可能會遇到的問題"&gt;面試實際可能會遇到的問題
&lt;/h2&gt;&lt;p&gt;「時間/空間複雜度？」&lt;br&gt;
(O(N)/ O(1))&lt;/p&gt;
&lt;h2 id="相似及延伸"&gt;相似及延伸
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Special Thanks suggestions/corrections from viewers:&lt;br&gt;
(歡迎提供意見協助更正歐~)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;從LeetCode學演算法，我們下次見囉，掰~&lt;/p&gt;
&lt;p&gt;感謝大家對這系列文章的支持！這邊跟大家自我工商一下：&lt;/p&gt;
&lt;p&gt;我將於&lt;strong&gt;11/26&lt;/strong&gt; 開設系列同名線上課程**「從Leetcode學演算法｜基礎篇」。** 在這堂課中，你將學會利用十種演算法/資料結構來優化解題過程，&lt;br&gt;
並實際完整練習&lt;strong&gt;20題&lt;/strong&gt; 精選考古題，&lt;br&gt;
進而逐漸提升到不需提示也可以突破白板題，取得工作門票！&lt;br&gt;
&lt;strong&gt;問卷抽書＆取得上架通知：&lt;/strong&gt; &lt;a class="link" href="https://pse.is/MS2J2?fbclid=IwAR2PMTGbMG-8qh2eq-kfGoolRWWYMPcEXdOa1Bib_pFFUaPlTlGb3UYAeDw" target="_blank" rel="noopener"
&gt;&lt;strong&gt;https://pse.is/MS2J2&lt;/strong&gt; &lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Leetcode解題挑戰拿優惠：&lt;/strong&gt; &lt;a class="link" href="https://pse.is/NAUVP?fbclid=IwAR0g8Xi2wsWb8z2gWKgRGNz3HprupSc9MHbBCRnoXBaAEB7r3NNU8JiQXTc" target="_blank" rel="noopener"
&gt;&lt;strong&gt;https://pse.is/NAUVP&lt;/strong&gt; &lt;/a&gt;&lt;br&gt;
如果你對線上課程不放心，&lt;br&gt;
也可以先來&lt;strong&gt;12/17(二)&lt;/strong&gt; 我在天瓏分享的講座看看！&lt;br&gt;
&lt;strong&gt;講座連結：&lt;/strong&gt; &lt;a class="link" href="https://pse.is/JS3LJ?fbclid=IwAR2j615ajqdqNsNHWTST4JnlCdbQzQecNaZG9LV7J55VFnw8ufLWojrk7iw" target="_blank" rel="noopener"
&gt;&lt;strong&gt;https://pse.is/JS3LJ&lt;/strong&gt; &lt;/a&gt;&lt;/p&gt;</description></item><item><title>從LeetCode學演算法 - 44 Linked List (5)</title><link>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-44-linked-list-5/</link><pubDate>Tue, 03 Sep 2019 00:00:00 +0800</pubDate><guid>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-44-linked-list-5/</guid><description>&lt;img src="https://desolve.pages.dev/img/default-leetcode.webp" alt="Featured image of post 從LeetCode學演算法 - 44 Linked List (5)" /&gt;&lt;p&gt;&lt;strong&gt;0160. Intersection of Two Linked Lists (Easy)&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="question"&gt;Question
&lt;/h2&gt;&lt;p&gt;Write a program to find the node at which the intersection of two singly linked lists begins.&lt;/p&gt;
&lt;p&gt;For example, the following two linked lists:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://desolve.pages.dev/post/learn-algorithm-from-leetcode-44-linked-list-5/image-001.png"
width="742"
height="241"
srcset="https://desolve.pages.dev/post/learn-algorithm-from-leetcode-44-linked-list-5/image-001_hu_5a8dd4939483a227.png 480w, https://desolve.pages.dev/post/learn-algorithm-from-leetcode-44-linked-list-5/image-001_hu_610d365b6a698bf4.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="307"
data-flex-basis="738px"
&gt;&lt;/p&gt;
&lt;p&gt;begin to intersect at node c1.&lt;/p&gt;
&lt;h3 id="example-1"&gt;Example 1
&lt;/h3&gt;&lt;p&gt;&lt;img src="https://desolve.pages.dev/post/learn-algorithm-from-leetcode-44-linked-list-5/image-002.png"
width="742"
height="241"
srcset="https://desolve.pages.dev/post/learn-algorithm-from-leetcode-44-linked-list-5/image-002_hu_8e23ac65d732480c.png 480w, https://desolve.pages.dev/post/learn-algorithm-from-leetcode-44-linked-list-5/image-002_hu_84d556eccfd7b896.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="307"
data-flex-basis="738px"
&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input: intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: Reference of the node with value = 8
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input Explanation: The intersected node&amp;#39;s value is 8 (note that this must not be 0 if the two lists intersect). From the head of A, it reads as [4,1,8,4,5]. From the head of B, it reads as [5,0,1,8,4,5]. There are 2 nodes before the intersected node in A; There are 3 nodes before the intersected node in B.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="example-2"&gt;Example 2
&lt;/h3&gt;&lt;p&gt;&lt;img src="https://desolve.pages.dev/post/learn-algorithm-from-leetcode-44-linked-list-5/image-003.png"
width="622"
height="241"
srcset="https://desolve.pages.dev/post/learn-algorithm-from-leetcode-44-linked-list-5/image-003_hu_53dc878b793b0877.png 480w, https://desolve.pages.dev/post/learn-algorithm-from-leetcode-44-linked-list-5/image-003_hu_d9229c8e8965da74.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="258"
data-flex-basis="619px"
&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input: intersectVal = 2, listA = [0,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: Reference of the node with value = 2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input Explanation: The intersected node&amp;#39;s value is 2 (note that this must not be 0 if the two lists intersect). From the head of A, it reads as [0,9,1,2,4]. From the head of B, it reads as [3,2,4]. There are 3 nodes before the intersected node in A; There are 1 node before the intersected node in B.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="example-3"&gt;Example 3
&lt;/h3&gt;&lt;p&gt;&lt;img src="https://desolve.pages.dev/post/learn-algorithm-from-leetcode-44-linked-list-5/image-004.png"
width="382"
height="241"
srcset="https://desolve.pages.dev/post/learn-algorithm-from-leetcode-44-linked-list-5/image-004_hu_f640c5aa2ca7dd0a.png 480w, https://desolve.pages.dev/post/learn-algorithm-from-leetcode-44-linked-list-5/image-004_hu_807b747edfaff1e5.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="158"
data-flex-basis="380px"
&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input: intersectVal = 0, listA = [2,6,4], listB = [1,5], skipA = 3, skipB = 2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: null
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input Explanation: From the head of A, it reads as [2,6,4]. From the head of B, it reads as [1,5]. Since the two lists do not intersect, intersectVal must be 0, while skipA and skipB can be arbitrary values.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Explanation: The two lists do not intersect, so return null.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Notes:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If the two linked lists have no intersection at all, return &lt;code&gt;null&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The linked lists must retain their original structure after the function returns.&lt;/li&gt;
&lt;li&gt;You may assume there are no cycles anywhere in the entire linked structure.&lt;/li&gt;
&lt;li&gt;Your code should preferably run in O(n) time and use only O(1) memory.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="分析解題"&gt;分析/解題
&lt;/h3&gt;&lt;p&gt;有兩個單向連結串列，試找出其交會開始的節點。&lt;br&gt;
如果它們彼此之間沒有相交，則回傳null。&lt;br&gt;
(注意中提到最好時間使用O(n)且空間僅使用O(1)。)&lt;/p&gt;
&lt;p&gt;這題其實相當簡單，但要特別留意一點：&lt;br&gt;
&lt;strong&gt;就算兩個節點的值相等，也並不代表它們是同一個節點。&lt;/strong&gt;&lt;br&gt;
從Example 1中就可以看到這個例子，&lt;br&gt;
節點值都是1，但並非同節點，這部分要特別留意。&lt;br&gt;
不過我們並未特別針對ListNode去實作相等的function的狀況下，&lt;br&gt;
直接用**==** 判斷即可。&lt;/p&gt;
&lt;p&gt;那麼，怎麼來找共同的交會節點呢？&lt;br&gt;
我們可以先假設它們有一個交會點，&lt;br&gt;
那麼list A跟list B在這個交會點(含)以後的節點數會相等。&lt;br&gt;
(因為重合了XD)&lt;/p&gt;
&lt;p&gt;所以比如說A總長度是9，B總長度是6，&lt;br&gt;
我們可以先讓&lt;strong&gt;A從開頭走3步&lt;/strong&gt; ，(&lt;strong&gt;這樣才能對齊&lt;/strong&gt; )&lt;br&gt;
接著兩邊開始依序走訪比對走到的節點是否交會，&lt;br&gt;
若交會則回傳；&lt;strong&gt;若走到底還沒有看到相同的節點，&lt;br&gt;
則回傳null(或None)。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;所以大體上的操作如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;設定iteA/iteB作為走訪list A/list B用的節點&lt;/li&gt;
&lt;li&gt;先各自走訪過一輪來取得A和B分別的長度&lt;/li&gt;
&lt;li&gt;長度相減，讓比較長的list的起始節點先多走相差的節點數&lt;/li&gt;
&lt;li&gt;同時開始第二次的走訪，一邊比對節點是否交會，&lt;br&gt;
是則回傳該節點，不是則走到至少一邊走完為止&lt;/li&gt;
&lt;li&gt;若4走完尚未回傳則回傳null(表示沒有交會)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;寫成程式碼如下。&lt;/p&gt;
&lt;h3 id="java"&gt;Java
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/928504259af8be4de8e5e1da0a51fc4a.js"&gt;&lt;/script&gt;
&lt;p&gt;Python的部分可以寫得稍微簡潔一點，&lt;br&gt;
留意用來遞進用的迴圈這裡的for會使用單底線，&lt;br&gt;
因為我們只想要使用重複diff或-diff次的功能，&lt;br&gt;
並不在意迴圈執行到第幾次。&lt;/p&gt;
&lt;h3 id="python"&gt;Python
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/dfa5b6bf3008a6e184d3b9a06439e465.js"&gt;&lt;/script&gt;
&lt;h2 id="面試實際可能會遇到的問題"&gt;面試實際可能會遇到的問題
&lt;/h2&gt;&lt;p&gt;「時間/空間複雜度？」&lt;br&gt;
(O(N), O(1)，我們共遍歷了最多兩次的list，&lt;br&gt;
且只有額外使用到幾個輔助用的節點和變數。)&lt;/p&gt;
&lt;h2 id="相似及延伸"&gt;相似及延伸
&lt;/h2&gt;&lt;p&gt;1.&lt;a class="link" href="https://leetcode.com/problems/minimum-index-sum-of-two-lists/" target="_blank" rel="noopener"
&gt;&lt;strong&gt;0599. Minimum Index Sum of Two Lists&lt;/strong&gt; &lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Special Thanks suggestions/corrections from viewers:&lt;br&gt;
(歡迎提供意見協助更正歐~)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;從LeetCode學演算法，我們下次見囉，掰~&lt;/p&gt;</description></item><item><title>從LeetCode學演算法 - 31 Linked List (4)</title><link>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-31-linked-list-4/</link><pubDate>Thu, 15 Aug 2019 00:00:00 +0800</pubDate><guid>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-31-linked-list-4/</guid><description>&lt;img src="https://desolve.pages.dev/img/default-leetcode.webp" alt="Featured image of post 從LeetCode學演算法 - 31 Linked List (4)" /&gt;&lt;p&gt;&lt;strong&gt;0141. Linked List Cycle (Easy)&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="question"&gt;Question
&lt;/h2&gt;&lt;p&gt;Given a linked list, determine if it has a cycle in it.&lt;/p&gt;
&lt;p&gt;To represent a cycle in the given linked list, we use an integer &lt;code&gt;pos&lt;/code&gt; which represents the position (0-indexed) in the linked list where tail connects to. If &lt;code&gt;pos&lt;/code&gt; is &lt;code&gt;-1&lt;/code&gt;, then there is no cycle in the linked list.&lt;/p&gt;
&lt;h3 id="example-1"&gt;Example 1
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input: head = [3,2,0,-4], pos = 1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: true
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Explanation: There is a cycle in the linked list, where tail connects to the second node.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;img src="https://desolve.pages.dev/post/learn-algorithm-from-leetcode-31-linked-list-4/image-001.png"
width="531"
height="171"
srcset="https://desolve.pages.dev/post/learn-algorithm-from-leetcode-31-linked-list-4/image-001_hu_1e183735a13a9266.png 480w, https://desolve.pages.dev/post/learn-algorithm-from-leetcode-31-linked-list-4/image-001_hu_7b813f43c9cac31d.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="310"
data-flex-basis="745px"
&gt;&lt;/p&gt;
&lt;h3 id="example-2"&gt;Example 2
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input: head = [1,2], pos = 0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: true
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Explanation: There is a cycle in the linked list, where tail connects to the first node.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;img src="https://desolve.pages.dev/post/learn-algorithm-from-leetcode-31-linked-list-4/image-002.png"
width="201"
height="105"
srcset="https://desolve.pages.dev/post/learn-algorithm-from-leetcode-31-linked-list-4/image-002_hu_66ba386d6cde637c.png 480w, https://desolve.pages.dev/post/learn-algorithm-from-leetcode-31-linked-list-4/image-002_hu_3dc5cce82eda6858.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="191"
data-flex-basis="459px"
&gt;&lt;/p&gt;
&lt;h3 id="example-3"&gt;Example 3
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input: head = [1], pos = -1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: false
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Explanation: There is no cycle in the linked list.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;img src="https://desolve.pages.dev/post/learn-algorithm-from-leetcode-31-linked-list-4/image-003.png"
width="65"
height="65"
srcset="https://desolve.pages.dev/post/learn-algorithm-from-leetcode-31-linked-list-4/image-003_hu_31e40cb7b599483b.png 480w, https://desolve.pages.dev/post/learn-algorithm-from-leetcode-31-linked-list-4/image-003_hu_2012780a7cd099f1.png 1024w"
loading="lazy"
class="gallery-image"
data-flex-grow="100"
data-flex-basis="240px"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Follow up:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Can you solve it using &lt;em&gt;O(1)&lt;/em&gt; (i.e. constant) memory?&lt;/p&gt;
&lt;h3 id="分析解題"&gt;分析/解題
&lt;/h3&gt;&lt;p&gt;給定一個Linked List，試檢查其是否含有一個&lt;strong&gt;環(Cycle)&lt;/strong&gt; 在裡面。&lt;br&gt;
我們有一小段時間沒有講Linked List，這邊不再贅述其基礎特性，&lt;br&gt;
想要複習的讀者可以參閱&lt;a class="link" href="../learn-algorithm-from-leetcode-4-linked-list-1" &gt;第4篇&lt;/a&gt;的說明。&lt;/p&gt;
&lt;p&gt;當我們在考慮這個題目的時候，會留意到兩個特性：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;這個Linked List是指Single Linked List(也就是指向的方向只有單向)。&lt;/li&gt;
&lt;li&gt;如果有環的話，應該會從最後一個節點再連接到前面的節點。&lt;br&gt;
(從中間的話就會產生分歧的狀況)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;在以上的特性狀況下，假設有一個環在Linked List中的話，&lt;br&gt;
取一個節點從head開始不斷往其next走，會先經過最後一個節點，&lt;br&gt;
接著再接回到前面某個節點再往下走，這樣會是一個循環；&lt;br&gt;
更重要的是，顯然&lt;strong&gt;一進入這個環中，接下來就會一直在環內移動&lt;/strong&gt; 。&lt;br&gt;
(因為走到尾端又會再接回來)&lt;/p&gt;
&lt;p&gt;這裡我們引入一個蠻常用的解題方式：&lt;strong&gt;設定快速和慢速的指標&lt;/strong&gt; 。&lt;br&gt;
我們讓fast和slow先設定在head的位置，每次&lt;strong&gt;fast走兩步，slow走一步&lt;/strong&gt; ，&lt;br&gt;
它們就像是國小時針分針追趕的感覺一樣。&lt;/p&gt;
&lt;p&gt;接下來我們可以將狀況分成以下兩種：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;假設&lt;strong&gt;有環&lt;/strong&gt; 的狀況，&lt;br&gt;
&lt;strong&gt;不管走多快多慢都會陷入這個環內&lt;/strong&gt; ，&lt;br&gt;
所以會變成&lt;strong&gt;每次fast多走了一步，這一步用來追趕slow&lt;/strong&gt; 。&lt;br&gt;
因為slow也沒別的地方可以躲，所以fast每次多走一步一定可以趕得上&lt;br&gt;
(也因為一步一步趕所以沒有追上卻錯開的可能)。&lt;br&gt;
因此，我們知道fast和slow最終會來到相同的位置(也就是&lt;strong&gt;兩者相等&lt;/strong&gt; )&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;假設&lt;strong&gt;沒有環&lt;/strong&gt; 的狀況，&lt;br&gt;
由於不會重複，故最終&lt;strong&gt;fast一定會先走到尾端&lt;/strong&gt; ，最後看到&lt;strong&gt;NIL&lt;/strong&gt; 。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;故我們要做的事情很簡單，只要先設定fast跟slow，&lt;br&gt;
在它們沒有走到NIL之前，每次去檢查fast是否有追上slow。&lt;br&gt;
追上的話就回傳&lt;strong&gt;true&lt;/strong&gt; ，而&lt;strong&gt;如果看到fast的下一個節點是NIL&lt;/strong&gt; 的話，&lt;br&gt;
就代表&lt;strong&gt;走到盡頭了&lt;/strong&gt; ，此時應該要回傳&lt;strong&gt;false&lt;/strong&gt; 。&lt;/p&gt;
&lt;p&gt;整個演算的順序：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;考量起始的狀況，我們必須先檢查&lt;strong&gt;head跟head.next&lt;/strong&gt; 當中是否有NIL值&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;開始一個迴圈，&lt;br&gt;
開始前讓&lt;strong&gt;fast被設定為fast.next.next，slow則被設定為slow.next&lt;/strong&gt; 。&lt;br&gt;
當fast還沒有遇到NIL前，每次各自走相應步數，再檢查兩者是否相等。&lt;br&gt;
(&lt;strong&gt;相等表示有環&lt;/strong&gt; ，回傳&lt;strong&gt;true&lt;/strong&gt; )&lt;br&gt;
請注意：當&lt;strong&gt;fast和fast.next&lt;/strong&gt; 都處於&lt;strong&gt;非NIL&lt;/strong&gt; 的狀況時，迴圈才能夠執行。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;當fast或fast.next是NIL的話：表示走到盡頭了！跳離迴圈後，&lt;br&gt;
將其&lt;strong&gt;return false&lt;/strong&gt; 以表示它當中並沒有環。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;寫成程式碼大概如下面所示：&lt;/p&gt;
&lt;h3 id="java"&gt;Java
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/7d39c65d06367e19a2bd961a82aae5cd.js"&gt;&lt;/script&gt;
&lt;p&gt;Python這邊額外提供了LeetCode使用者 &lt;em&gt;StefanPochmann&lt;/em&gt; 的做法，&lt;br&gt;
這個做法使用了try…except來進行錯誤處理，&lt;br&gt;
有興趣的讀者不妨試試看。&lt;/p&gt;
&lt;h3 id="python"&gt;Python
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/11c7a3a81a54be093a070b2d046f8346.js"&gt;&lt;/script&gt;
&lt;h2 id="面試實際可能會遇到的問題"&gt;面試實際可能會遇到的問題
&lt;/h2&gt;&lt;p&gt;「時間/空間複雜度？」&lt;br&gt;
(O(N), O(1)&lt;br&gt;
由於fast比slow每次多走一步，我們可預期在走環的部分時，為了相遇走的長度的複雜度為O(K)。那麼K最大也頂多就是囊括所有節點，&lt;br&gt;
所以&lt;strong&gt;時間的複雜度最大就會取決於N&lt;/strong&gt; 。&lt;br&gt;
當然，還有另一種狀況是&lt;strong&gt;裡面沒有環&lt;/strong&gt; ，&lt;br&gt;
時間複雜度也是O(N)。(走到底就結束了)&lt;br&gt;
另外，我們沒有另外需要存下其他整個LinkedList的節點，所以僅有一些必要的節點被宣告，故空間複雜度為O(1))&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;相似及延伸：&lt;br&gt;
1.&lt;/strong&gt; &lt;a class="link" href="https://leetcode.com/problems/linked-list-cycle-ii/" target="_blank" rel="noopener"
&gt;** 0142.** Linked List Cycle II&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Special Thanks suggestions/corrections from viewers:&lt;br&gt;
(歡迎提供意見協助更正歐~)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;從LeetCode學演算法，我們下次見囉，掰~&lt;/p&gt;</description></item><item><title>從LeetCode學演算法 - 12 Linked List (3)/ Stack (1)</title><link>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-12-linked-list-3-stack-1/</link><pubDate>Fri, 12 Jul 2019 00:00:00 +0800</pubDate><guid>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-12-linked-list-3-stack-1/</guid><description>&lt;img src="https://desolve.pages.dev/img/default-leetcode.webp" alt="Featured image of post 從LeetCode學演算法 - 12 Linked List (3)/ Stack (1)" /&gt;&lt;p&gt;&lt;strong&gt;0092. Reverse Linked List II (Medium)&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="question"&gt;Question
&lt;/h2&gt;&lt;p&gt;Reverse a linked list from position &lt;em&gt;m&lt;/em&gt; to &lt;em&gt;n&lt;/em&gt;. Do it in one-pass.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; 1 ≤ &lt;em&gt;m&lt;/em&gt; ≤ &lt;em&gt;n&lt;/em&gt; ≤ length of the list.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input: 1-&amp;gt;2-&amp;gt;3-&amp;gt;4-&amp;gt;5-&amp;gt;NULL, m = 2, n = 4
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: 1-&amp;gt;4-&amp;gt;3-&amp;gt;2-&amp;gt;5-&amp;gt;NULL
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="分析解題"&gt;分析/解題
&lt;/h3&gt;&lt;p&gt;給定一個linked list，在只經過一次的操作下(每個node不會額外再走訪)，&lt;br&gt;
題目要求將m到n的位置的節點進行反轉。&lt;/p&gt;
&lt;p&gt;由範例可知這邊的m跟n是以開頭為1而非0來計算，這點讀者請特別留意。&lt;/p&gt;
&lt;p&gt;我們先從理論上來看這題應該怎麼處理：&lt;br&gt;
首先根據題目要求，m可能和n相等，&lt;br&gt;
相等的狀況下其實完全不用做事，回傳head即可。&lt;/p&gt;
&lt;p&gt;那麼如果是不相等的狀況呢？&lt;br&gt;
在Linked List中，要知道某個位置的節點為何，唯有&lt;strong&gt;從頭一路走到該節點&lt;/strong&gt; 。&lt;br&gt;
我們想要反轉的是m&lt;del&gt;n的位置：&lt;br&gt;
以範例來說，會將2&lt;/del&gt;4的位置進行反轉。&lt;br&gt;
如何反轉呢？首先我們要先走到2的左邊，當我們把中間的部分反轉後，&lt;br&gt;
我們還要將它們和左右兩邊接起來，要記得2的左邊跟4的右邊的節點才行。&lt;br&gt;
(不然接不起來就GG了XD)&lt;br&gt;
這邊將2的左邊命名為left，一路往下走的迭代節點命名為node，&lt;br&gt;
走到m-1以前先記錄下left節點，再繼續往下走。&lt;/p&gt;
&lt;p&gt;接下來問題來了，如何將2~4的部分反向連接呢？&lt;br&gt;
你可以選擇一個一個拆解並重新鍵結，&lt;br&gt;
但這裡筆者想介紹一個常用的資料結構：Stack(堆疊，或稱棧/堆棧)。&lt;br&gt;
Stack的樣子，就跟某些苦命的辦公室人員的書桌一樣：&lt;br&gt;
&lt;strong&gt;你會嘗試將書桌上的文件/工作處理完，但老闆總是會往上面再加新的。&lt;/strong&gt; 也就是說，每次如果你選擇&lt;strong&gt;從最上面開始拿&lt;/strong&gt; (別從中間或下面，這麼高的文件可是會塌的！)，你會拿到&lt;strong&gt;最新的&lt;/strong&gt; 工作。&lt;/p&gt;
&lt;p&gt;Stack也是如此，假設你將1, 2, 3, 4, 5依序放入Stack中，那麼當你從Stack裡面拿東西的時候，拿出來的順序會是5, 4, 3, 2, 1。&lt;strong&gt;最後放進去的會最先被拿出來&lt;/strong&gt; ，這樣子的特性我們稱之為Last In First Out(後進先出，簡寫為LIFO)。有另一種資料結構叫&lt;strong&gt;Queue(隊列，或稱佇列)&lt;/strong&gt; 跟它剛好相反，是&lt;strong&gt;先進先出&lt;/strong&gt; ，我們以後找機會再講解它。&lt;/p&gt;
&lt;p&gt;如果這題應用上Stack的話，就簡單許多：&lt;br&gt;
&lt;strong&gt;我們將2~4的部分通通丟進Stack中，再一個一個拿出來&lt;/strong&gt; ，&lt;br&gt;
這時候順序就會變成4, 3, 2了！那麼，只要將剛剛存好的left，以及後面我們邊走邊看到4的時候，將它的右邊記錄起來的node，兩者再和中間的節點連結起來，就完成整個反轉的流程。&lt;/p&gt;
&lt;p&gt;重新整理解題的順序：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;判斷m是否和n相等，相等則直接回傳原先的head。&lt;/li&gt;
&lt;li&gt;定義一個迭代用節點node，先走到m-1的位置以取得節點left。&lt;/li&gt;
&lt;li&gt;讓node從m一路走到n，將每個node放入到Stack中。&lt;br&gt;
(註:放入的術語在堆疊中叫作push)&lt;/li&gt;
&lt;li&gt;node再額外走一步會走到n+1的位置&lt;/li&gt;
&lt;li&gt;依次將Stack中的節點取出，並且依序連接所有節點的next，&lt;br&gt;
直到Stack中再也沒有節點。&lt;br&gt;
(註:取出的術語在堆疊中叫做pop)&lt;/li&gt;
&lt;li&gt;將反轉完的尾巴和node做連接，結束整個反轉的流程。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;這當中還有額外一點需要注意的是&lt;strong&gt;m=1&lt;/strong&gt; 的狀況，&lt;br&gt;
因為我們最後回傳的是用&lt;strong&gt;head&lt;/strong&gt; 來代表整個linked list，&lt;br&gt;
如果m為1的話，代表head其實已經被改變了，&lt;br&gt;
我們需要同步更新head的部分。&lt;/p&gt;
&lt;p&gt;請參照Java的寫法，我們採用了l1和l2兩個節點來處理依序連接的部分。&lt;br&gt;
我們會先取出堆疊中第一個節點，這個節點會被left連接，&lt;br&gt;
接下來使用&lt;strong&gt;l2 = st.pop(); l1.next=l2; l1 = l2;&lt;/strong&gt;&lt;br&gt;
來進行一次取一個node，將前後連接好以後，&lt;br&gt;
將位置移到下一個準備連接的點。&lt;br&gt;
也就是說，&lt;strong&gt;每次l1所在的位置，都是當前準備進行連接next的節點&lt;/strong&gt; 。&lt;br&gt;
(若讀者對這邊的說明感到抽象，請務必在紙上試著操作一下會較清楚)&lt;/p&gt;
&lt;p&gt;在Java中，Stack的宣告方式是：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Stack&amp;lt;&amp;gt; st = new Stack&amp;lt;&amp;gt;();
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;請在&amp;quot;&amp;lt;&amp;gt;&amp;ldquo;之中填入你想要使用的資料型態，&lt;br&gt;
在本例中為題目已經定義的class ListNode。&lt;/p&gt;
&lt;p&gt;函式用法的部分，push()用來放入節點，pop()用來取出節點，&lt;br&gt;
isEmpty()則是檢查Stack是否是空的。&lt;br&gt;
(還有一個peek()，是用來看Stack最上面節點，&lt;br&gt;
但不會真的將節點從Stack中移除)&lt;/p&gt;
&lt;h3 id="java"&gt;Java
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/5f1c1300afeb8aa6ab4cfabebbb09f28.js"&gt;&lt;/script&gt;
&lt;p&gt;在Python中，list的特性可以方便的用來當作Stack使用，&lt;br&gt;
放入節點可以使用append()，取出節點使用pop()。&lt;/p&gt;
&lt;h3 id="python"&gt;Python
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/eeb85ba29bb9832ce6143040c9a799be.js"&gt;&lt;/script&gt;
&lt;h2 id="面試實際可能會遇到的問題"&gt;面試實際可能會遇到的問題
&lt;/h2&gt;&lt;p&gt;「時間/空間複雜度？」&lt;br&gt;
(O(N), O(n-m)，因為我們的堆疊最多只需要存中間的部分和兩旁的node)&lt;/p&gt;
&lt;p&gt;「可以只用O(1)的空間嗎？」&lt;br&gt;
(可以，如果我們按順序一個一個處理m~n之間的連結，&lt;br&gt;
最後再將n和m和左右兩邊連起來，是可以不使用Stack的&lt;br&gt;
中間的連接方式會像是：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;third = cur.next
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cur.next = prev
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;prev = cur
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cur = third
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;讀者有興趣的話可以嘗試看看。)&lt;/p&gt;
&lt;p&gt;從LeetCode學演算法，我們下次見囉，掰~&lt;/p&gt;</description></item><item><title>從LeetCode學演算法 - 10 Linked List (2)</title><link>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-10-linked-list-2/</link><pubDate>Wed, 10 Jul 2019 00:00:00 +0800</pubDate><guid>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-10-linked-list-2/</guid><description>&lt;img src="https://desolve.pages.dev/img/default-leetcode.webp" alt="Featured image of post 從LeetCode學演算法 - 10 Linked List (2)" /&gt;&lt;p&gt;&lt;strong&gt;0083. Remove Duplicates from Sorted List (Easy)&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="question"&gt;Question
&lt;/h2&gt;&lt;p&gt;Given a sorted linked list, delete all duplicates such that each element appears only &lt;em&gt;once&lt;/em&gt;.&lt;/p&gt;
&lt;h3 id="example-1"&gt;Example 1
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input: 1-&amp;gt;1-&amp;gt;2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: 1-&amp;gt;2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="example-2"&gt;Example 2
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input: 1-&amp;gt;1-&amp;gt;2-&amp;gt;3-&amp;gt;3
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: 1-&amp;gt;2-&amp;gt;3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="分析解題"&gt;分析/解題
&lt;/h3&gt;&lt;p&gt;題目給定一個已排序好的linked list，要求將所有重複的node皆刪除，&lt;br&gt;
使得每個元素均只出現一次。&lt;/p&gt;
&lt;p&gt;這題也算是比較簡單的linked list類型，只要確定連接正確的話並不難解。&lt;br&gt;
由於已經排序過的原因，所有會重複的元素值均會相鄰，那麼我們所要做的就是遇到重複時&lt;strong&gt;總共只保留一個就好了&lt;/strong&gt; 。&lt;br&gt;
保留哪一個呢？當然是保留第一個囉！&lt;/p&gt;
&lt;p&gt;我們可以先宣告一個ListNode，命名為ite用來做為iterator(迭代器)，&lt;br&gt;
每次取得ite的下一個node(命名為tmp)做為暫存。&lt;br&gt;
接下來開始一路往下尋找，如果ite和tmp前後值相等時，就讓tmp開始往下&lt;strong&gt;一直走到底部(表示後面值都一樣)&lt;/strong&gt; 或者&lt;strong&gt;找到下一個不同的值。&lt;/strong&gt; 對於&lt;strong&gt;前者的狀況&lt;/strong&gt; 而言，表示結束，tmp會指到null(或None)，&lt;br&gt;
只要將&lt;strong&gt;ite.next指向到tmp&lt;/strong&gt; 即可。&lt;/p&gt;
&lt;p&gt;對於&lt;strong&gt;後者的狀況&lt;/strong&gt; ，這時候tmp的位置就在&lt;strong&gt;下一個相異值的點&lt;/strong&gt; 。&lt;br&gt;
像是1-&amp;gt;2-&amp;gt;2-&amp;gt;2-&amp;gt;3-&amp;gt;4這樣子，從ite在碰到第一個2以後，&lt;br&gt;
tmp會一路找到3的位置，所以我們只要將&lt;strong&gt;ite.next指向到tmp&lt;/strong&gt; ，&lt;br&gt;
即可將第一個2接到3的位置，從而中間的部分就等於被我們刪去了。&lt;/p&gt;
&lt;p&gt;討論完兩者狀況後，我們會發現無論是哪一種，&lt;br&gt;
結果都會是將ite.next指向到tmp，&lt;br&gt;
最後要記得ite本身要遞移到下一個開始找的位置，&lt;br&gt;
所以我們還需要將tmp的位置交給ite。&lt;/p&gt;
&lt;h3 id="java"&gt;Java
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/55fea85d03d195ae3ff6a2d7e5500524.js"&gt;&lt;/script&gt;
&lt;p&gt;以Python的部分來說，還記得判斷式可以直接適用於if的話，&lt;br&gt;
就可以寫得看起來簡潔一些。&lt;/p&gt;
&lt;h3 id="python"&gt;Python
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/aab3f6eec5e1901867f93ac138364f1c.js"&gt;&lt;/script&gt;
&lt;h2 id="面試實際可能會遇到的問題"&gt;面試實際可能會遇到的問題
&lt;/h2&gt;&lt;p&gt;「時間/空間複雜度？」&lt;br&gt;
(O(N), O(1))&lt;/p&gt;
&lt;p&gt;其它應該沒什麼好問的，至少我沒想到XD&lt;br&gt;
這篇主要是協助讀者再熟悉一下這些連接/斷開的操作。&lt;/p&gt;
&lt;p&gt;從LeetCode學演算法，我們下次見囉，掰~&lt;/p&gt;</description></item><item><title>從LeetCode學演算法 - 4 Linked List (1)</title><link>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-4-linked-list-1/</link><pubDate>Mon, 01 Jul 2019 00:00:00 +0800</pubDate><guid>https://desolve.pages.dev/post/learn-algorithm-from-leetcode-4-linked-list-1/</guid><description>&lt;img src="https://desolve.pages.dev/img/default-leetcode.webp" alt="Featured image of post 從LeetCode學演算法 - 4 Linked List (1)" /&gt;&lt;p&gt;&lt;strong&gt;0021. Merge Two Sorted Lists (Easy)&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="question"&gt;Question
&lt;/h2&gt;&lt;p&gt;Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input: 1-&amp;gt;2-&amp;gt;4, 1-&amp;gt;3-&amp;gt;4
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Output: 1-&amp;gt;1-&amp;gt;2-&amp;gt;3-&amp;gt;4-&amp;gt;4
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="分析解題"&gt;分析/解題
&lt;/h3&gt;&lt;p&gt;題目要求將兩個已排序的linked lists合併，&lt;br&gt;
且所產生的新list必須由原有的節點(node)所構成。&lt;/p&gt;
&lt;p&gt;Linked List是一個很常見的資料結構，資料與資料連接的方式是單向的，&lt;br&gt;
通常從第一個節點(node)往後連接到最後一個節點(node)。&lt;br&gt;
每個節點上會存放一個(或一組)資料以及連結(link)，&lt;br&gt;
每個連結會&lt;strong&gt;指向到下一個節點&lt;/strong&gt; 的位置(記憶體位址)。&lt;br&gt;
(在C/C++裡面連結基本上就是指標(pointer))&lt;/p&gt;
&lt;p&gt;你可能會問，那麼最後一個節點呢?&lt;br&gt;
最後一個節點除了儲存資料以外，因為連結沒有東西了，所以會給定空值。在演算法的書中一般會稱為&lt;strong&gt;NIL&lt;/strong&gt; ，NIL在英文裡面就是&lt;strong&gt;nothing&lt;/strong&gt; 的意思，&lt;br&gt;
表示沒有任何東西。&lt;/p&gt;
&lt;p&gt;在Java中有LinkedList的資料結構，它同樣是List的一種。&lt;br&gt;
但一般遇到題目的時候會給的通常是一個node，&lt;br&gt;
用來指向到該List的第一個節點。&lt;/p&gt;
&lt;p&gt;我們會看到如果你打開LeetCode選擇Java時，&lt;br&gt;
上方已經先用註解告訴你這個ListNode的結構了：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; * Definition for singly-linked list.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; * public class ListNode {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; * int val;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; * ListNode next;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; * ListNode(int x) { val = x; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; * }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; */
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;也就是說，題目預先定義了一個class叫做ListNode，&lt;br&gt;
&lt;strong&gt;val用來存放每個node的值，next用來指向到下一個node&lt;/strong&gt; ，&lt;br&gt;
有一個&lt;strong&gt;ListNode(int x)&lt;/strong&gt; 的建構子(constructor)，&lt;br&gt;
可以讓你在產生一個新的節點時給定其值。&lt;/p&gt;
&lt;p&gt;對於LinkedList來說，它最大的好處在於新增/刪除節點時相當方便。&lt;br&gt;
例如現在有a-&amp;gt;b，我想要加一個資料值為20的c節點，放在b後面的話，&lt;br&gt;
以Java而言只需要:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ListNode b = a.next; // 因為一開始我們只知道a的位置而已XD
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ListNode c = new ListNode(20);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;b.next = c;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果是插入在a跟b中間呢？也不難，&lt;br&gt;
只是我們要先記住b，不然一旦沒有人記它，它就消失在時空裂縫中了(誤)&lt;br&gt;
(會依照各自編譯器的規範，只是以我們而言是真的就沒辦法找到它了)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#8087a2"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#cad3f5;background-color:#24273a;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;// a -&amp;gt; c -&amp;gt; b
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ListNode b = a.next;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ListNode c = new ListNode(20);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;a.next = c;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;c.next = b;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;請留意如果你調動了一些節點的順序，留意他們的next是否被妥善處理，&lt;br&gt;
該被清空的請給定NIL。&lt;strong&gt;在Java中是用null來表示，而Python則是用None。&lt;/strong&gt; 回到題目，我們該如何去合併排列好的兩個LinkedList呢？&lt;br&gt;
這邊提供一個很簡單的遞迴思路。&lt;br&gt;
(遞迴的概念，我們之後再專門做一篇相關的來講解)&lt;br&gt;
我們合併兩個list的狀況目標還是要呈現排序好的樣子，&lt;br&gt;
那麼怎麼排呢？&lt;br&gt;
由於原先的list已經是排好的，&lt;br&gt;
我們拿出最左邊的node比較，稱為l1跟l2。&lt;br&gt;
l1是全空的狀況下，那其實答案就是l2(因為後面就不用繼續排了)，&lt;br&gt;
反之l2是全空的話，答案就是l1。&lt;br&gt;
那麼如果l1的值小於l2的值的話，那麼l1應該要當頭，&lt;br&gt;
接下來我們要拿&lt;strong&gt;l1.next&lt;/strong&gt; 跟&lt;strong&gt;l2&lt;/strong&gt; 來做比較大小，比較小的，&lt;br&gt;
就會是新的l1連接的下一個節點。&lt;br&gt;
一直連接到最後，我們就可以得到合併好的list了！&lt;br&gt;
相等的狀況因為題目沒有特別要求要分辨是l1還是l2的節點，&lt;br&gt;
所以任取一個均可。&lt;/p&gt;
&lt;p&gt;例：&lt;br&gt;
l1: 1 -&amp;gt; 3 -&amp;gt; 5 -&amp;gt;8 -&amp;gt;10, l2: 2 -&amp;gt; 4 -&amp;gt; 4&lt;br&gt;
1先跟2比，1比較小所以當頭(1) -&amp;gt; &lt;br&gt;
3跟2比，2比較小(1-&amp;gt;2) -&amp;gt;&lt;br&gt;
3跟4比(1-&amp;gt;2-&amp;gt;3) -&amp;gt;&lt;br&gt;
5跟4比(1-&amp;gt;2-&amp;gt;3-&amp;gt;4) -&amp;gt;&lt;br&gt;
5跟4比(1-&amp;gt;2-&amp;gt;3-&amp;gt;4-&amp;gt;4) -&amp;gt;&lt;br&gt;
l2的部分已經空了，填入l1中5以後剩下的部分&lt;br&gt;
(1-&amp;gt;2-&amp;gt;3-&amp;gt;4-&amp;gt;4-&amp;gt; 5 -&amp;gt;8 -&amp;gt;10)&lt;/p&gt;
&lt;p&gt;寫成Java的程式如下。&lt;/p&gt;
&lt;p&gt;Java:&lt;/p&gt;
&lt;script src="https://gist.github.com/Desolve/c5a4635fff728970132bbda438a1203e.js"&gt;&lt;/script&gt;
&lt;p&gt;當然我們也可以用迴圈(迭代)的方法來解，&lt;br&gt;
但這時候我們就要比較仔細的去處理節點間的關係了。&lt;br&gt;
在Python中判斷是否為None可以使用if，&lt;br&gt;
通過if的話節點就代表該節點是有值的，&lt;br&gt;
你也可以加入not的關鍵字來處理你所需要的判斷式。&lt;br&gt;
比如我可以用if not (l1 and l2)來表達其中一個以上是空的狀況，&lt;br&gt;
並回傳不是None的那個node。&lt;/p&gt;
&lt;p&gt;操作上，我們需要一個dummy node做為旁觀者，&lt;br&gt;
讓它從頭到尾都只&lt;strong&gt;保持在同樣的位置&lt;/strong&gt; ，並指向到第一個節點。&lt;/p&gt;
&lt;p&gt;接著我們定義一個節點叫做prev，&lt;br&gt;
&lt;strong&gt;prev的next&lt;/strong&gt; 會指定給下一個比較過後&lt;strong&gt;較小的那個節點&lt;/strong&gt; 。&lt;br&gt;
那麼，每次將prev的next拿到以後，&lt;br&gt;
l1或l2(看哪個比較小)就自己&lt;strong&gt;遞移到下一個節點&lt;/strong&gt; ，&lt;br&gt;
並且prev也往下走到自己的next，準備接取下一個節點；&lt;br&gt;
重覆上面的動作&lt;strong&gt;直到其中一邊節點用光&lt;/strong&gt; ，&lt;br&gt;
即可把剩下的直接全接到prev.next上。&lt;/p&gt;
&lt;p&gt;最終我們回傳的答案是&lt;strong&gt;dum.next&lt;/strong&gt; ，因為只有dum沒有被動過，&lt;br&gt;
其他的節點其實都已經被改動過指向的位址了。&lt;/p&gt;
&lt;h3 id="python"&gt;Python
&lt;/h3&gt;&lt;script src="https://gist.github.com/Desolve/7b3daa901e07ed8cf45983a68f552c9e.js"&gt;&lt;/script&gt;
&lt;p&gt;在有關linked list的部分，因為牽扯到位址的概念，&lt;br&gt;
所以操作上要稍微再思考一下，比較不容易搞混。&lt;br&gt;
最重要的是，對於Java和Python來說，由於所使用的都是class來建立node，&lt;br&gt;
所以其實你看到的等號，除了給定val的狀況以外，&lt;br&gt;
其他其實都是在做&lt;strong&gt;把右邊放的記憶體位址存到左邊&lt;/strong&gt; 的動作，&lt;br&gt;
所以&lt;strong&gt;指向的記憶體位址變了，代表的節點也就跟著變了&lt;/strong&gt; ，務必要留意這點。&lt;/p&gt;
&lt;h2 id="面試實際可能會遇到的問題"&gt;面試實際可能會遇到的問題
&lt;/h2&gt;&lt;p&gt;「請用iterative(迭代或迴圈)/recursive(遞迴)的方式來解」&lt;br&gt;
(上面Java是recursive solution，Python是iterative solution，&lt;br&gt;
讀者可以嘗試改成另一個語言試看看)&lt;/p&gt;
&lt;p&gt;「使用遞迴的話會有什麼限制？」&lt;br&gt;
(有可能受到編譯器規範的最大function stack上限限制，&lt;br&gt;
同時，連續的函式呼叫的效率，相對於在迴圈中執行來說會較差)&lt;/p&gt;
&lt;p&gt;「那為什麼你會用遞迴？」&lt;br&gt;
(因為遞迴比較好想啊XDDDDD)(別這麼誠實，雖然大家都知道XD)&lt;br&gt;
(因為在一般狀況下，遞迴解通常會較為容易閱讀，&lt;br&gt;
也比較符合人類的思路模式，就像推骨牌一樣，&lt;br&gt;
當起始條件和後續的脈絡定下來以後，後面的結果就會水到渠成。)&lt;/p&gt;
&lt;p&gt;「時間複雜度是？」&lt;br&gt;
( worst case是O(N1+N2)，best case是O(min(N1, N2))。)&lt;/p&gt;
&lt;p&gt;「如果希望你另外開一個新的linked list，不用原本的節點來解這題呢？」&lt;br&gt;
(這樣會比較簡單，一樣兩兩比較，但改成較小的取其val來產生一個新的ListNode，接在你的新的linked list後面，讀者可以嘗試看看，&lt;br&gt;
別忘記要留dummy node歐！)&lt;/p&gt;
&lt;p&gt;從LeetCode學演算法，我們下次見囉，掰~&lt;/p&gt;</description></item></channel></rss>