<!--?xml version="1.0" encoding="utf-8"?--><html><head></head><body><feed xmlns="http://www.w3.org/2005/Atom"><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://raymanng.github.io/feed.xml" rel="self" type="application/atom+xml"><link href="https://raymanng.github.io/" rel="alternate" type="text/html"><updated>2026-06-05T21:13:02+08:00</updated><id>https://raymanng.github.io/feed.xml</id><title type="html">Rayman Ng’s Blog</title><subtitle></subtitle><author><name>Rayman Ng</name></author><entry><title type="html">232 Implement Queue using Stacks</title><link href="https://raymanng.github.io/journal/leetcode/232-Implement-Queue-using-Stacks/" rel="alternate" type="text/html" title="232 Implement Queue using Stacks"><published>2025-06-27T00:00:00+08:00</published><updated>2025-06-27T00:00:00+08:00</updated><id>https://raymanng.github.io/journal/leetcode/232%20Implement%20Queue%20using%20Stacks</id><content type="html" xml:base="https://raymanng.github.io/journal/leetcode/232-Implement-Queue-using-Stacks/"><!--[CDATA[<h2 id="题目"-->题目
<p><a href="https://leetcode.com/problems/implement-queue-using-stacks/">Implement Queue using Stacks</a></p>

<h2 id="题解">题解</h2>
<p>题目要求用两个栈模拟一个队列，一个简单的方法是：每次push时都将元素压入到同一个栈（input_stack）中，当需要pop时则将input_stack里的元素全部弹出并压入到另一个栈（output_stack）里，此时output_stack里的顶部元素就是pop需要移除的元素，将其移除后再把output_stack剩余的元素全部倒回input_stack即可。</p>

<p>上面这个方法虽然简单，但是每次pop时都需要将所有元素都倒腾一遍，其时间复杂度为\(O(n)\)，这里我们可以利用output_stack的一个特点进行优化：output_stack里的元素自顶向下就已经按照队列pop的顺序排列好了。因此我们可以去掉把output_stack剩余元素全部倒回input_stack的操作，在pop的时直接从output_stack顶部进行弹出，当output_stack为空时则先把input_stack里的元素全部倒入output_stack。</p>

<p>在进行了优化之后，每个元素都只会有常数次（三次）移动：</p>
<ol>
  <li>压入input_stack</li>
  <li>从input_stack转移到output_stack</li>
  <li>从output_stack弹出</li>
</ol>

<p>因此pop操作的均摊时间复杂度从原来的\(O(n)\)优化到了\(O(1)\)。</p>

<h2 id="代码">代码</h2>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">MyQueue</span><span class="p">:</span>

    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="n">self</span><span class="p">):</span>
        <span class="n">self</span><span class="p">.</span><span class="n">input_stack</span> <span class="o">=</span> <span class="p">[]</span>
        <span class="n">self</span><span class="p">.</span><span class="n">output_stack</span> <span class="o">=</span> <span class="p">[]</span>

    <span class="k">def</span> <span class="nf">push</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">x</span><span class="p">:</span> <span class="nb">int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="bp">None</span><span class="p">:</span>
        <span class="n">self</span><span class="p">.</span><span class="n">input_stack</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">_shift</span><span class="p">(</span><span class="n">self</span><span class="p">):</span>
        <span class="k">while</span> <span class="nf">len</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="n">input_stack</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
            <span class="n">self</span><span class="p">.</span><span class="n">output_stack</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="n">input_stack</span><span class="p">.</span><span class="nf">pop</span><span class="p">())</span>

    <span class="k">def</span> <span class="nf">pop</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
        <span class="k">if</span> <span class="nf">len</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="n">output_stack</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
            <span class="n">self</span><span class="p">.</span><span class="nf">_shift</span><span class="p">()</span>
        <span class="k">return</span> <span class="n">self</span><span class="p">.</span><span class="n">output_stack</span><span class="p">.</span><span class="nf">pop</span><span class="p">()</span>

    <span class="k">def</span> <span class="nf">peek</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
        <span class="k">if</span> <span class="nf">len</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="n">output_stack</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
            <span class="n">self</span><span class="p">.</span><span class="nf">_shift</span><span class="p">()</span>
        <span class="k">return</span> <span class="n">self</span><span class="p">.</span><span class="n">output_stack</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>

    <span class="k">def</span> <span class="nf">empty</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
        <span class="k">return</span> <span class="nf">len</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="n">input_stack</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span> <span class="ow">and</span> <span class="nf">len</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="n">output_stack</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span>

</code></pre></div></div>]]&gt;</content><author><name>Rayman Ng</name></author><category term="Journal"><category term="LeetCode"><category term="Cracking-the-Coding-Interview"><summary type="html"><!--[CDATA[题目 Implement Queue using Stacks]]--></summary></category></category></category></entry><entry><title type="html">155 Min Stack</title><link href="https://raymanng.github.io/journal/leetcode/155-Min-Stack/" rel="alternate" type="text/html" title="155 Min Stack"><published>2025-06-10T00:00:00+08:00</published><updated>2025-06-10T00:00:00+08:00</updated><id>https://raymanng.github.io/journal/leetcode/155%20Min%20Stack</id><content type="html" xml:base="https://raymanng.github.io/journal/leetcode/155-Min-Stack/"><!--[CDATA[<h2 id="题目"-->题目
<p><a href="https://leetcode.com/problems/min-stack/">Min Stack</a></p>

<h2 id="题解">题解</h2>
<p>题目要求执行push、pop和min操作的时间复杂度必须为\(O(1)\)，所以搜索整个栈找出最小值的做法是不可行的，必须在执行push/pop操作时就记录下栈当前的最小值。</p>

<p>一个简单的做法是在栈里维护一个min变量，每次执行push操作时把当前的min（\(min(当前栈中的最小值，准备入栈的数据)\)）和数据值一起压入栈中，执行pop操作时则用新的栈顶元素中记录的min值维护min变量。然而这种方法会使得每个栈中的元素都要记录一个min值，可能会浪费许多空间。</p>

<p>一种更好的方法是另外使用一个栈min_stack来记录min数据，每次执行min操作时都返回min_stack的栈顶数据（若min_stack为空则返回整数最大值）。每次执行push/pop操作时，根据入栈/出栈的数据和当前min返回结果的大小关系来相应地更新min_stack。这样就能省下许多记录重复min值的空间，但是这里有一种特殊情况，那就是所有的值都是最小值。这种情况下是不会节省空间的，因为min_stack必须存储跟当前数据栈相同数量的最小值（例如，如果当前数据栈中的最小值为m，且数据栈中有n个m，那么min_stack中也应该有n个m），不然一个pop操作之后min_stack就变成空栈了，这也是为什么下面代码中push函数里的if条件是<code class="language-plaintext highlighter-rouge">val &lt;= self.getMin()</code>而不是<code class="language-plaintext highlighter-rouge">val &lt; self.getMin()</code>。</p>

<h2 id="代码">代码</h2>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">MinStack</span><span class="p">:</span>

    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="n">self</span><span class="p">):</span>
        <span class="n">self</span><span class="p">.</span><span class="n">value_stack</span> <span class="o">=</span> <span class="p">[]</span>
        <span class="n">self</span><span class="p">.</span><span class="n">min_stack</span> <span class="o">=</span> <span class="p">[]</span>

    <span class="k">def</span> <span class="nf">push</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">val</span><span class="p">:</span> <span class="nb">int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="bp">None</span><span class="p">:</span>
        <span class="n">self</span><span class="p">.</span><span class="n">value_stack</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="n">val</span><span class="p">)</span>
        <span class="k">if</span> <span class="n">val</span> <span class="o">&lt;=</span> <span class="n">self</span><span class="p">.</span><span class="nf">getMin</span><span class="p">():</span>
            <span class="n">self</span><span class="p">.</span><span class="n">min_stack</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="n">val</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">pop</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="bp">None</span><span class="p">:</span>
        <span class="n">val</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">value_stack</span><span class="p">.</span><span class="nf">pop</span><span class="p">()</span>
        <span class="k">if</span> <span class="n">val</span> <span class="o">==</span> <span class="n">self</span><span class="p">.</span><span class="nf">getMin</span><span class="p">():</span>
            <span class="n">self</span><span class="p">.</span><span class="n">min_stack</span><span class="p">.</span><span class="nf">pop</span><span class="p">()</span>

    <span class="k">def</span> <span class="nf">top</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">self</span><span class="p">.</span><span class="n">value_stack</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>

    <span class="k">def</span> <span class="nf">getMin</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
        <span class="k">if</span> <span class="nf">len</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="n">min_stack</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
            <span class="k">return</span> <span class="n">self</span><span class="p">.</span><span class="n">min_stack</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="k">return</span> <span class="n">sys</span><span class="p">.</span><span class="n">maxsize</span>
</code></pre></div></div>]]&gt;</content><author><name>Rayman Ng</name></author><category term="Journal"><category term="LeetCode"><category term="Cracking-the-Coding-Interview"><summary type="html"><!--[CDATA[题目 Min Stack]]--></summary></category></category></category></entry><entry><title type="html">142 Linked List Cycle II</title><link href="https://raymanng.github.io/journal/leetcode/142-Linked-List-Cycle-II/" rel="alternate" type="text/html" title="142 Linked List Cycle II"><published>2025-05-29T00:00:00+08:00</published><updated>2025-05-29T00:00:00+08:00</updated><id>https://raymanng.github.io/journal/leetcode/142%20Linked%20List%20Cycle%20II</id><content type="html" xml:base="https://raymanng.github.io/journal/leetcode/142-Linked-List-Cycle-II/"><!--[CDATA[<h2 id="题目"-->题目
<p><a href="https://leetcode.com/problems/linked-list-cycle-ii/">Linked List Cycle II</a></p>

<h2 id="题解">题解</h2>
<p>首先要检测链表中是否存在环路，这里可以使用快慢指针的技巧，因为快指针与慢指针在存在环路的链表中必然会相遇。</p>
<div class="language-graphviz highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">digraph</span> <span class="nv">G</span> <span class="p">{</span>
    <span class="n">layout</span> <span class="p">=</span> <span class="nv">circo</span>
    <span class="nv">A</span> <span class="o">-&gt;</span> <span class="nv">B</span> <span class="o">-&gt;</span> <span class="nv">C</span> <span class="o">-&gt;</span> <span class="nv">D</span>
    <span class="nv">D</span> <span class="o">-&gt;</span> <span class="nv">E</span> <span class="o">-&gt;</span> <span class="nv">F</span> <span class="o">-&gt;</span> <span class="nv">G</span> <span class="o">-&gt;</span> <span class="nv">H</span> <span class="o">-&gt;</span> <span class="nv">I</span> <span class="o">-&gt;</span> <span class="nv">J</span> <span class="o">-&gt;</span> <span class="nv">D</span>
<span class="p">}</span>
</code></pre></div></div>

<p>记链表中环路之前的部分长度为k，环路的长度为loop_size。当慢指针走了k步进入环路起始点时，快指针已经走了2k步，也就是已经走了k步进入环路并且在环路部分中又走了k步，此时快指针位于\(P = k \bmod loop\_size\)的位置。</p>

<p>如下图所示，慢指针位于环路起始处，快指针位于位置P，二者相距\(loop\_size - P\)个节点，由于慢指针每走一步快指针就走两步，快指针每次都会向慢指针多靠近一步，所以二者会在\(loop\_size - P\)步之后相遇，也就是说慢指针从环路起始处走\(loop\_size - P\)步之后的节点就是快慢指针相遇的节点。</p>
<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%" viewbox="0 0 334.325 118.144" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
<g>
<g id="glyph-0-0">
<path d="M 3.96875 -6.9375 C 3.921875 -7.0625 3.890625 -7.140625 3.734375 -7.140625 C 3.578125 -7.140625 3.546875 -7.078125 3.5 -6.9375 L 1.4375 -0.984375 C 1.25 -0.46875 0.859375 -0.3125 0.3125 -0.3125 L 0.3125 0 C 0.546875 -0.015625 0.984375 -0.03125 1.328125 -0.03125 C 1.640625 -0.03125 2.15625 -0.015625 2.484375 0 L 2.484375 -0.3125 C 1.984375 -0.3125 1.734375 -0.5625 1.734375 -0.8125 C 1.734375 -0.84375 1.75 -0.953125 1.75 -0.96875 L 2.21875 -2.265625 L 4.671875 -2.265625 L 5.203125 -0.75 C 5.21875 -0.703125 5.234375 -0.640625 5.234375 -0.609375 C 5.234375 -0.3125 4.671875 -0.3125 4.40625 -0.3125 L 4.40625 0 C 4.765625 -0.03125 5.46875 -0.03125 5.84375 -0.03125 C 6.265625 -0.03125 6.734375 -0.015625 7.140625 0 L 7.140625 -0.3125 L 6.96875 -0.3125 C 6.375 -0.3125 6.234375 -0.375 6.125 -0.703125 Z M 3.4375 -5.828125 L 4.5625 -2.578125 L 2.328125 -2.578125 Z M 3.4375 -5.828125 "></path>
</g>
<g id="glyph-0-1">
<path d="M 2.21875 -3.65625 L 2.21875 -6.09375 C 2.21875 -6.4375 2.234375 -6.5 2.703125 -6.5 L 3.9375 -6.5 C 4.90625 -6.5 5.25 -5.65625 5.25 -5.125 C 5.25 -4.484375 4.765625 -3.65625 3.65625 -3.65625 Z M 4.5625 -3.5625 C 5.53125 -3.75 6.21875 -4.390625 6.21875 -5.125 C 6.21875 -5.984375 5.296875 -6.8125 4 -6.8125 L 0.359375 -6.8125 L 0.359375 -6.5 L 0.59375 -6.5 C 1.359375 -6.5 1.390625 -6.390625 1.390625 -6.03125 L 1.390625 -0.78125 C 1.390625 -0.421875 1.359375 -0.3125 0.59375 -0.3125 L 0.359375 -0.3125 L 0.359375 0 L 4.265625 0 C 5.59375 0 6.484375 -0.890625 6.484375 -1.828125 C 6.484375 -2.6875 5.671875 -3.4375 4.5625 -3.5625 Z M 3.953125 -0.3125 L 2.703125 -0.3125 C 2.234375 -0.3125 2.21875 -0.375 2.21875 -0.703125 L 2.21875 -3.421875 L 4.09375 -3.421875 C 5.078125 -3.421875 5.5 -2.5 5.5 -1.828125 C 5.5 -1.125 4.96875 -0.3125 3.953125 -0.3125 Z M 3.953125 -0.3125 "></path>
</g>
<g id="glyph-0-2">
<path d="M 0.5625 -3.40625 C 0.5625 -1.34375 2.171875 0.21875 4.03125 0.21875 C 5.65625 0.21875 6.625 -1.171875 6.625 -2.328125 C 6.625 -2.421875 6.625 -2.5 6.5 -2.5 C 6.390625 -2.5 6.390625 -2.4375 6.375 -2.328125 C 6.296875 -0.90625 5.234375 -0.09375 4.140625 -0.09375 C 3.53125 -0.09375 1.578125 -0.421875 1.578125 -3.40625 C 1.578125 -6.375 3.53125 -6.71875 4.140625 -6.71875 C 5.21875 -6.71875 6.109375 -5.8125 6.3125 -4.359375 C 6.328125 -4.21875 6.328125 -4.1875 6.46875 -4.1875 C 6.625 -4.1875 6.625 -4.21875 6.625 -4.421875 L 6.625 -6.78125 C 6.625 -6.953125 6.625 -7.03125 6.515625 -7.03125 C 6.484375 -7.03125 6.4375 -7.03125 6.359375 -6.90625 L 5.859375 -6.171875 C 5.5 -6.53125 4.984375 -7.03125 4.03125 -7.03125 C 2.15625 -7.03125 0.5625 -5.4375 0.5625 -3.40625 Z M 0.5625 -3.40625 "></path>
</g>
<g id="glyph-0-3">
<path d="M 2.265625 -3.15625 L 3.953125 -3.15625 C 5.140625 -3.15625 6.21875 -3.953125 6.21875 -4.953125 C 6.21875 -5.9375 5.234375 -6.8125 3.875 -6.8125 L 0.34375 -6.8125 L 0.34375 -6.5 L 0.59375 -6.5 C 1.359375 -6.5 1.375 -6.390625 1.375 -6.03125 L 1.375 -0.78125 C 1.375 -0.421875 1.359375 -0.3125 0.59375 -0.3125 L 0.34375 -0.3125 L 0.34375 0 C 0.703125 -0.03125 1.4375 -0.03125 1.8125 -0.03125 C 2.1875 -0.03125 2.9375 -0.03125 3.296875 0 L 3.296875 -0.3125 L 3.046875 -0.3125 C 2.28125 -0.3125 2.265625 -0.421875 2.265625 -0.78125 Z M 2.234375 -3.40625 L 2.234375 -6.09375 C 2.234375 -6.4375 2.25 -6.5 2.71875 -6.5 L 3.609375 -6.5 C 5.1875 -6.5 5.1875 -5.4375 5.1875 -4.953125 C 5.1875 -4.484375 5.1875 -3.40625 3.609375 -3.40625 Z M 2.234375 -3.40625 "></path>
</g>
<g id="glyph-0-4">
<path d="M 5.796875 -6.78125 L 0.328125 -6.78125 L 0.328125 -6.46875 L 0.5625 -6.46875 C 1.328125 -6.46875 1.359375 -6.359375 1.359375 -6 L 1.359375 -0.78125 C 1.359375 -0.421875 1.328125 -0.3125 0.5625 -0.3125 L 0.328125 -0.3125 L 0.328125 0 C 0.671875 -0.03125 1.453125 -0.03125 1.84375 -0.03125 C 2.25 -0.03125 3.15625 -0.03125 3.515625 0 L 3.515625 -0.3125 L 3.1875 -0.3125 C 2.25 -0.3125 2.25 -0.4375 2.25 -0.78125 L 2.25 -3.234375 L 3.09375 -3.234375 C 4.0625 -3.234375 4.15625 -2.921875 4.15625 -2.078125 L 4.40625 -2.078125 L 4.40625 -4.71875 L 4.15625 -4.71875 C 4.15625 -3.875 4.0625 -3.546875 3.09375 -3.546875 L 2.25 -3.546875 L 2.25 -6.078125 C 2.25 -6.40625 2.265625 -6.46875 2.734375 -6.46875 L 3.921875 -6.46875 C 5.421875 -6.46875 5.671875 -5.90625 5.828125 -4.53125 L 6.078125 -4.53125 Z M 5.796875 -6.78125 "></path>
</g>
<g id="glyph-0-5">
<path d="M 1.359375 -0.78125 C 1.359375 -0.421875 1.328125 -0.3125 0.5625 -0.3125 L 0.328125 -0.3125 L 0.328125 0 L 6.078125 0 L 6.5 -2.578125 L 6.25 -2.578125 C 6 -1.03125 5.765625 -0.3125 4.0625 -0.3125 L 2.734375 -0.3125 C 2.265625 -0.3125 2.25 -0.375 2.25 -0.703125 L 2.25 -3.375 L 3.140625 -3.375 C 4.109375 -3.375 4.21875 -3.046875 4.21875 -2.203125 L 4.46875 -2.203125 L 4.46875 -4.84375 L 4.21875 -4.84375 C 4.21875 -3.984375 4.109375 -3.671875 3.140625 -3.671875 L 2.25 -3.671875 L 2.25 -6.078125 C 2.25 -6.40625 2.265625 -6.46875 2.734375 -6.46875 L 4.015625 -6.46875 C 5.546875 -6.46875 5.8125 -5.921875 5.96875 -4.53125 L 6.21875 -4.53125 L 5.9375 -6.78125 L 0.328125 -6.78125 L 0.328125 -6.46875 L 0.5625 -6.46875 C 1.328125 -6.46875 1.359375 -6.359375 1.359375 -6 Z M 1.359375 -0.78125 "></path>
</g>
<g id="glyph-0-6">
<path d="M 2.078125 -1.9375 C 2.296875 -1.890625 3.109375 -1.734375 3.109375 -1.015625 C 3.109375 -0.515625 2.765625 -0.109375 1.984375 -0.109375 C 1.140625 -0.109375 0.78125 -0.671875 0.59375 -1.53125 C 0.5625 -1.65625 0.5625 -1.6875 0.453125 -1.6875 C 0.328125 -1.6875 0.328125 -1.625 0.328125 -1.453125 L 0.328125 -0.125 C 0.328125 0.046875 0.328125 0.109375 0.4375 0.109375 C 0.484375 0.109375 0.5 0.09375 0.6875 -0.09375 C 0.703125 -0.109375 0.703125 -0.125 0.890625 -0.3125 C 1.328125 0.09375 1.78125 0.109375 1.984375 0.109375 C 3.125 0.109375 3.59375 -0.5625 3.59375 -1.28125 C 3.59375 -1.796875 3.296875 -2.109375 3.171875 -2.21875 C 2.84375 -2.546875 2.453125 -2.625 2.03125 -2.703125 C 1.46875 -2.8125 0.8125 -2.9375 0.8125 -3.515625 C 0.8125 -3.875 1.0625 -4.28125 1.921875 -4.28125 C 3.015625 -4.28125 3.078125 -3.375 3.09375 -3.078125 C 3.09375 -2.984375 3.1875 -2.984375 3.203125 -2.984375 C 3.34375 -2.984375 3.34375 -3.03125 3.34375 -3.21875 L 3.34375 -4.234375 C 3.34375 -4.390625 3.34375 -4.46875 3.234375 -4.46875 C 3.1875 -4.46875 3.15625 -4.46875 3.03125 -4.34375 C 3 -4.3125 2.90625 -4.21875 2.859375 -4.1875 C 2.484375 -4.46875 2.078125 -4.46875 1.921875 -4.46875 C 0.703125 -4.46875 0.328125 -3.796875 0.328125 -3.234375 C 0.328125 -2.890625 0.484375 -2.609375 0.75 -2.390625 C 1.078125 -2.140625 1.359375 -2.078125 2.078125 -1.9375 Z M 2.078125 -1.9375 "></path>
</g>
<g id="glyph-0-7">
<path d="M 1.71875 -3.984375 L 3.15625 -3.984375 L 3.15625 -4.296875 L 1.71875 -4.296875 L 1.71875 -6.125 L 1.46875 -6.125 C 1.46875 -5.3125 1.171875 -4.25 0.1875 -4.203125 L 0.1875 -3.984375 L 1.03125 -3.984375 L 1.03125 -1.234375 C 1.03125 -0.015625 1.96875 0.109375 2.328125 0.109375 C 3.03125 0.109375 3.3125 -0.59375 3.3125 -1.234375 L 3.3125 -1.796875 L 3.0625 -1.796875 L 3.0625 -1.25 C 3.0625 -0.515625 2.765625 -0.140625 2.390625 -0.140625 C 1.71875 -0.140625 1.71875 -1.046875 1.71875 -1.21875 Z M 1.71875 -3.984375 "></path>
</g>
<g id="glyph-0-8">
<path d="M 3.3125 -0.75 C 3.359375 -0.359375 3.625 0.0625 4.09375 0.0625 C 4.3125 0.0625 4.921875 -0.078125 4.921875 -0.890625 L 4.921875 -1.453125 L 4.671875 -1.453125 L 4.671875 -0.890625 C 4.671875 -0.3125 4.421875 -0.25 4.3125 -0.25 C 3.984375 -0.25 3.9375 -0.703125 3.9375 -0.75 L 3.9375 -2.734375 C 3.9375 -3.15625 3.9375 -3.546875 3.578125 -3.921875 C 3.1875 -4.3125 2.6875 -4.46875 2.21875 -4.46875 C 1.390625 -4.46875 0.703125 -4 0.703125 -3.34375 C 0.703125 -3.046875 0.90625 -2.875 1.171875 -2.875 C 1.453125 -2.875 1.625 -3.078125 1.625 -3.328125 C 1.625 -3.453125 1.578125 -3.78125 1.109375 -3.78125 C 1.390625 -4.140625 1.875 -4.25 2.1875 -4.25 C 2.6875 -4.25 3.25 -3.859375 3.25 -2.96875 L 3.25 -2.609375 C 2.734375 -2.578125 2.046875 -2.546875 1.421875 -2.25 C 0.671875 -1.90625 0.421875 -1.390625 0.421875 -0.953125 C 0.421875 -0.140625 1.390625 0.109375 2.015625 0.109375 C 2.671875 0.109375 3.125 -0.296875 3.3125 -0.75 Z M 3.25 -2.390625 L 3.25 -1.390625 C 3.25 -0.453125 2.53125 -0.109375 2.078125 -0.109375 C 1.59375 -0.109375 1.1875 -0.453125 1.1875 -0.953125 C 1.1875 -1.5 1.609375 -2.328125 3.25 -2.390625 Z M 3.25 -2.390625 "></path>
</g>
<g id="glyph-0-9">
<path d="M 1.671875 -3.3125 L 1.671875 -4.40625 L 0.28125 -4.296875 L 0.28125 -3.984375 C 0.984375 -3.984375 1.0625 -3.921875 1.0625 -3.421875 L 1.0625 -0.75 C 1.0625 -0.3125 0.953125 -0.3125 0.28125 -0.3125 L 0.28125 0 C 0.671875 -0.015625 1.140625 -0.03125 1.421875 -0.03125 C 1.8125 -0.03125 2.28125 -0.03125 2.6875 0 L 2.6875 -0.3125 L 2.46875 -0.3125 C 1.734375 -0.3125 1.71875 -0.421875 1.71875 -0.78125 L 1.71875 -2.3125 C 1.71875 -3.296875 2.140625 -4.1875 2.890625 -4.1875 C 2.953125 -4.1875 2.984375 -4.1875 3 -4.171875 C 2.96875 -4.171875 2.765625 -4.046875 2.765625 -3.78125 C 2.765625 -3.515625 2.984375 -3.359375 3.203125 -3.359375 C 3.375 -3.359375 3.625 -3.484375 3.625 -3.796875 C 3.625 -4.109375 3.3125 -4.40625 2.890625 -4.40625 C 2.15625 -4.40625 1.796875 -3.734375 1.671875 -3.3125 Z M 1.671875 -3.3125 "></path>
</g>
<g id="glyph-0-10">
<path d="M 3.984375 -4.171875 L 5.78125 -5.90625 C 5.859375 -5.984375 6.390625 -6.484375 7.203125 -6.5 L 7.203125 -6.8125 C 6.9375 -6.78125 6.625 -6.78125 6.34375 -6.78125 C 5.984375 -6.78125 5.421875 -6.78125 5.078125 -6.8125 L 5.078125 -6.5 C 5.484375 -6.484375 5.546875 -6.265625 5.546875 -6.171875 C 5.546875 -6.015625 5.4375 -5.90625 5.359375 -5.84375 L 2.25 -2.859375 L 2.25 -6.03125 C 2.25 -6.390625 2.265625 -6.5 3.03125 -6.5 L 3.265625 -6.5 L 3.265625 -6.8125 C 2.921875 -6.78125 2.1875 -6.78125 1.796875 -6.78125 C 1.421875 -6.78125 0.671875 -6.78125 0.328125 -6.8125 L 0.328125 -6.5 L 0.5625 -6.5 C 1.328125 -6.5 1.359375 -6.390625 1.359375 -6.03125 L 1.359375 -0.78125 C 1.359375 -0.421875 1.328125 -0.3125 0.5625 -0.3125 L 0.328125 -0.3125 L 0.328125 0 C 0.671875 -0.03125 1.421875 -0.03125 1.796875 -0.03125 C 2.171875 -0.03125 2.921875 -0.03125 3.265625 0 L 3.265625 -0.3125 L 3.03125 -0.3125 C 2.265625 -0.3125 2.25 -0.421875 2.25 -0.78125 L 2.25 -2.515625 L 3.40625 -3.625 L 5.203125 -0.953125 C 5.265625 -0.859375 5.359375 -0.734375 5.359375 -0.609375 C 5.359375 -0.3125 4.96875 -0.3125 4.765625 -0.3125 L 4.765625 0 C 5.109375 -0.03125 5.8125 -0.03125 6.1875 -0.03125 C 6.546875 -0.03125 6.921875 -0.015625 7.34375 0 L 7.34375 -0.3125 C 6.796875 -0.3125 6.59375 -0.34375 6.296875 -0.78125 Z M 3.984375 -4.171875 "></path>
</g>
<g id="glyph-0-11">
<path d="M 3.015625 -1.46875 C 3.015625 -0.5625 2.515625 0 1.984375 0 C 1.921875 0 1.25 0 0.890625 -0.578125 C 1.40625 -0.578125 1.53125 -0.875 1.53125 -1.140625 C 1.53125 -1.5 1.25 -1.6875 0.96875 -1.6875 C 0.75 -1.6875 0.40625 -1.5625 0.40625 -1.109375 C 0.40625 -0.375 1.109375 0.21875 2 0.21875 C 3.015625 0.21875 3.75 -0.484375 3.859375 -1.21875 C 3.875 -1.3125 3.875 -1.328125 3.875 -1.671875 L 3.875 -6.09375 C 3.875 -6.5 4 -6.5 4.640625 -6.5 L 4.640625 -6.8125 C 4.203125 -6.78125 3.8125 -6.78125 3.34375 -6.78125 C 2.9375 -6.78125 2.046875 -6.78125 1.671875 -6.8125 L 1.671875 -6.5 L 2.03125 -6.5 C 3.015625 -6.5 3.015625 -6.375 3.015625 -6.015625 Z M 3.015625 -1.46875 "></path>
</g>
<g id="glyph-0-12">
<path d="M 2.25 -6.03125 C 2.25 -6.390625 2.265625 -6.5 3.0625 -6.5 L 3.3125 -6.5 L 3.3125 -6.8125 C 2.96875 -6.78125 2.1875 -6.78125 1.796875 -6.78125 C 1.421875 -6.78125 0.625 -6.78125 0.28125 -6.8125 L 0.28125 -6.5 L 0.53125 -6.5 C 1.328125 -6.5 1.359375 -6.390625 1.359375 -6.03125 L 1.359375 -0.78125 C 1.359375 -0.421875 1.328125 -0.3125 0.53125 -0.3125 L 0.28125 -0.3125 L 0.28125 0 C 0.625 -0.03125 1.421875 -0.03125 1.796875 -0.03125 C 2.1875 -0.03125 2.96875 -0.03125 3.3125 0 L 3.3125 -0.3125 L 3.0625 -0.3125 C 2.265625 -0.3125 2.25 -0.421875 2.25 -0.78125 Z M 2.25 -6.03125 "></path>
</g>
<g id="glyph-0-13">
<path d="M 1.765625 -6.921875 L 0.328125 -6.8125 L 0.328125 -6.5 C 1.03125 -6.5 1.109375 -6.4375 1.109375 -5.9375 L 1.109375 -0.75 C 1.109375 -0.3125 1 -0.3125 0.328125 -0.3125 L 0.328125 0 C 0.65625 -0.015625 1.1875 -0.03125 1.4375 -0.03125 C 1.6875 -0.03125 2.171875 -0.015625 2.546875 0 L 2.546875 -0.3125 C 1.875 -0.3125 1.765625 -0.3125 1.765625 -0.75 Z M 1.765625 -6.921875 "></path>
</g>
<g id="glyph-0-14">
<path d="M 4.6875 -2.140625 C 4.6875 -3.40625 3.703125 -4.46875 2.5 -4.46875 C 1.25 -4.46875 0.28125 -3.375 0.28125 -2.140625 C 0.28125 -0.84375 1.3125 0.109375 2.484375 0.109375 C 3.6875 0.109375 4.6875 -0.875 4.6875 -2.140625 Z M 2.5 -0.140625 C 2.0625 -0.140625 1.625 -0.34375 1.359375 -0.8125 C 1.109375 -1.25 1.109375 -1.859375 1.109375 -2.21875 C 1.109375 -2.609375 1.109375 -3.140625 1.34375 -3.578125 C 1.609375 -4.03125 2.078125 -4.25 2.484375 -4.25 C 2.921875 -4.25 3.34375 -4.03125 3.609375 -3.59375 C 3.875 -3.171875 3.875 -2.59375 3.875 -2.21875 C 3.875 -1.859375 3.875 -1.3125 3.65625 -0.875 C 3.421875 -0.421875 2.984375 -0.140625 2.5 -0.140625 Z M 2.5 -0.140625 "></path>
</g>
<g id="glyph-0-15">
<path d="M 6.171875 -3.34375 C 6.34375 -3.84375 6.65625 -3.984375 7.015625 -3.984375 L 7.015625 -4.296875 C 6.78125 -4.28125 6.5 -4.265625 6.28125 -4.265625 C 5.984375 -4.265625 5.546875 -4.28125 5.359375 -4.296875 L 5.359375 -3.984375 C 5.71875 -3.984375 5.9375 -3.796875 5.9375 -3.515625 C 5.9375 -3.453125 5.9375 -3.421875 5.875 -3.296875 L 4.96875 -0.75 L 3.984375 -3.53125 C 3.953125 -3.65625 3.9375 -3.671875 3.9375 -3.71875 C 3.9375 -3.984375 4.328125 -3.984375 4.53125 -3.984375 L 4.53125 -4.296875 C 4.234375 -4.28125 3.734375 -4.265625 3.484375 -4.265625 C 3.1875 -4.265625 2.90625 -4.28125 2.609375 -4.296875 L 2.609375 -3.984375 C 2.96875 -3.984375 3.125 -3.96875 3.234375 -3.84375 C 3.28125 -3.78125 3.390625 -3.484375 3.453125 -3.296875 L 2.609375 -0.875 L 1.65625 -3.53125 C 1.609375 -3.65625 1.609375 -3.671875 1.609375 -3.71875 C 1.609375 -3.984375 2 -3.984375 2.1875 -3.984375 L 2.1875 -4.296875 C 1.890625 -4.28125 1.328125 -4.265625 1.109375 -4.265625 C 1.0625 -4.265625 0.53125 -4.28125 0.171875 -4.296875 L 0.171875 -3.984375 C 0.671875 -3.984375 0.796875 -3.953125 0.921875 -3.640625 L 2.171875 -0.109375 C 2.21875 0.03125 2.25 0.109375 2.375 0.109375 C 2.515625 0.109375 2.53125 0.046875 2.578125 -0.09375 L 3.59375 -2.90625 L 4.609375 -0.078125 C 4.640625 0.03125 4.671875 0.109375 4.8125 0.109375 C 4.9375 0.109375 4.96875 0.015625 5 -0.078125 Z M 6.171875 -3.34375 "></path>
</g>
<g id="glyph-0-16">
<path d="M 1.75 -4.296875 L 1.75 -5.453125 C 1.75 -6.328125 2.21875 -6.8125 2.65625 -6.8125 C 2.6875 -6.8125 2.84375 -6.8125 2.984375 -6.734375 C 2.875 -6.703125 2.6875 -6.5625 2.6875 -6.3125 C 2.6875 -6.09375 2.84375 -5.890625 3.125 -5.890625 C 3.40625 -5.890625 3.5625 -6.09375 3.5625 -6.328125 C 3.5625 -6.703125 3.1875 -7.03125 2.65625 -7.03125 C 1.96875 -7.03125 1.109375 -6.5 1.109375 -5.4375 L 1.109375 -4.296875 L 0.328125 -4.296875 L 0.328125 -3.984375 L 1.109375 -3.984375 L 1.109375 -0.75 C 1.109375 -0.3125 1 -0.3125 0.34375 -0.3125 L 0.34375 0 C 0.734375 -0.015625 1.203125 -0.03125 1.46875 -0.03125 C 1.875 -0.03125 2.34375 -0.03125 2.734375 0 L 2.734375 -0.3125 L 2.53125 -0.3125 C 1.796875 -0.3125 1.78125 -0.421875 1.78125 -0.78125 L 1.78125 -3.984375 L 2.90625 -3.984375 L 2.90625 -4.296875 Z M 1.75 -4.296875 "></path>
</g>
<g id="glyph-0-17">
<path d="M 1.171875 -2.171875 C 1.171875 -3.796875 1.984375 -4.21875 2.515625 -4.21875 C 2.609375 -4.21875 3.234375 -4.203125 3.578125 -3.84375 C 3.171875 -3.8125 3.109375 -3.515625 3.109375 -3.390625 C 3.109375 -3.125 3.296875 -2.9375 3.5625 -2.9375 C 3.828125 -2.9375 4.03125 -3.09375 4.03125 -3.40625 C 4.03125 -4.078125 3.265625 -4.46875 2.5 -4.46875 C 1.25 -4.46875 0.34375 -3.390625 0.34375 -2.15625 C 0.34375 -0.875 1.328125 0.109375 2.484375 0.109375 C 3.8125 0.109375 4.140625 -1.09375 4.140625 -1.1875 C 4.140625 -1.28125 4.03125 -1.28125 4 -1.28125 C 3.921875 -1.28125 3.890625 -1.25 3.875 -1.1875 C 3.59375 -0.265625 2.9375 -0.140625 2.578125 -0.140625 C 2.046875 -0.140625 1.171875 -0.5625 1.171875 -2.171875 Z M 1.171875 -2.171875 "></path>
</g>
<g id="glyph-0-18">
<path d="M 1.765625 -4.40625 L 0.375 -4.296875 L 0.375 -3.984375 C 1.015625 -3.984375 1.109375 -3.921875 1.109375 -3.4375 L 1.109375 -0.75 C 1.109375 -0.3125 1 -0.3125 0.328125 -0.3125 L 0.328125 0 C 0.640625 -0.015625 1.1875 -0.03125 1.421875 -0.03125 C 1.78125 -0.03125 2.125 -0.015625 2.46875 0 L 2.46875 -0.3125 C 1.796875 -0.3125 1.765625 -0.359375 1.765625 -0.75 Z M 1.796875 -6.140625 C 1.796875 -6.453125 1.5625 -6.671875 1.28125 -6.671875 C 0.96875 -6.671875 0.75 -6.40625 0.75 -6.140625 C 0.75 -5.875 0.96875 -5.609375 1.28125 -5.609375 C 1.5625 -5.609375 1.796875 -5.828125 1.796875 -6.140625 Z M 1.796875 -6.140625 "></path>
</g>
<g id="glyph-0-19">
<path d="M 1.09375 -3.421875 L 1.09375 -0.75 C 1.09375 -0.3125 0.984375 -0.3125 0.3125 -0.3125 L 0.3125 0 C 0.671875 -0.015625 1.171875 -0.03125 1.453125 -0.03125 C 1.703125 -0.03125 2.21875 -0.015625 2.5625 0 L 2.5625 -0.3125 C 1.890625 -0.3125 1.78125 -0.3125 1.78125 -0.75 L 1.78125 -2.59375 C 1.78125 -3.625 2.5 -4.1875 3.125 -4.1875 C 3.765625 -4.1875 3.875 -3.65625 3.875 -3.078125 L 3.875 -0.75 C 3.875 -0.3125 3.765625 -0.3125 3.09375 -0.3125 L 3.09375 0 C 3.4375 -0.015625 3.953125 -0.03125 4.21875 -0.03125 C 4.46875 -0.03125 5 -0.015625 5.328125 0 L 5.328125 -0.3125 C 4.8125 -0.3125 4.5625 -0.3125 4.5625 -0.609375 L 4.5625 -2.515625 C 4.5625 -3.375 4.5625 -3.671875 4.25 -4.03125 C 4.109375 -4.203125 3.78125 -4.40625 3.203125 -4.40625 C 2.46875 -4.40625 2 -3.984375 1.71875 -3.359375 L 1.71875 -4.40625 L 0.3125 -4.296875 L 0.3125 -3.984375 C 1.015625 -3.984375 1.09375 -3.921875 1.09375 -3.421875 Z M 1.09375 -3.421875 "></path>
</g>
<g id="glyph-0-20">
<path d="M 3.484375 -3.875 L 2.203125 -4.171875 C 1.578125 -4.328125 1.203125 -4.859375 1.203125 -5.4375 C 1.203125 -6.140625 1.734375 -6.75 2.515625 -6.75 C 4.171875 -6.75 4.390625 -5.109375 4.453125 -4.671875 C 4.46875 -4.609375 4.46875 -4.546875 4.578125 -4.546875 C 4.703125 -4.546875 4.703125 -4.59375 4.703125 -4.78125 L 4.703125 -6.78125 C 4.703125 -6.953125 4.703125 -7.03125 4.59375 -7.03125 C 4.53125 -7.03125 4.515625 -7.015625 4.453125 -6.890625 L 4.09375 -6.328125 C 3.796875 -6.625 3.390625 -7.03125 2.5 -7.03125 C 1.390625 -7.03125 0.5625 -6.15625 0.5625 -5.09375 C 0.5625 -4.265625 1.09375 -3.53125 1.859375 -3.265625 C 1.96875 -3.234375 2.484375 -3.109375 3.1875 -2.9375 C 3.453125 -2.875 3.75 -2.796875 4.03125 -2.4375 C 4.234375 -2.171875 4.34375 -1.84375 4.34375 -1.515625 C 4.34375 -0.8125 3.84375 -0.09375 3 -0.09375 C 2.71875 -0.09375 1.953125 -0.140625 1.421875 -0.625 C 0.84375 -1.171875 0.8125 -1.796875 0.8125 -2.15625 C 0.796875 -2.265625 0.71875 -2.265625 0.6875 -2.265625 C 0.5625 -2.265625 0.5625 -2.1875 0.5625 -2.015625 L 0.5625 -0.015625 C 0.5625 0.15625 0.5625 0.21875 0.671875 0.21875 C 0.734375 0.21875 0.75 0.203125 0.8125 0.09375 C 0.8125 0.078125 0.84375 0.046875 1.171875 -0.484375 C 1.484375 -0.140625 2.125 0.21875 3.015625 0.21875 C 4.171875 0.21875 4.96875 -0.75 4.96875 -1.859375 C 4.96875 -2.84375 4.3125 -3.671875 3.484375 -3.875 Z M 3.484375 -3.875 "></path>
</g>
<g id="glyph-0-21">
<path d="M 1.71875 -3.75 L 1.71875 -4.40625 L 0.28125 -4.296875 L 0.28125 -3.984375 C 0.984375 -3.984375 1.0625 -3.921875 1.0625 -3.484375 L 1.0625 1.171875 C 1.0625 1.625 0.953125 1.625 0.28125 1.625 L 0.28125 1.9375 C 0.625 1.921875 1.140625 1.90625 1.390625 1.90625 C 1.671875 1.90625 2.171875 1.921875 2.515625 1.9375 L 2.515625 1.625 C 1.859375 1.625 1.75 1.625 1.75 1.171875 L 1.75 -0.59375 C 1.796875 -0.421875 2.21875 0.109375 2.96875 0.109375 C 4.15625 0.109375 5.1875 -0.875 5.1875 -2.15625 C 5.1875 -3.421875 4.234375 -4.40625 3.109375 -4.40625 C 2.328125 -4.40625 1.90625 -3.96875 1.71875 -3.75 Z M 1.75 -1.140625 L 1.75 -3.359375 C 2.03125 -3.875 2.515625 -4.15625 3.03125 -4.15625 C 3.765625 -4.15625 4.359375 -3.28125 4.359375 -2.15625 C 4.359375 -0.953125 3.671875 -0.109375 2.9375 -0.109375 C 2.53125 -0.109375 2.15625 -0.3125 1.890625 -0.71875 C 1.75 -0.921875 1.75 -0.9375 1.75 -1.140625 Z M 1.75 -1.140625 "></path>
</g>
</g>
<clippath id="clip-0">
<path clip-rule="nonzero" d="M 205 100 L 224 100 L 224 118.144531 L 205 118.144531 Z M 205 100 "></path>
</clippath>
</defs>
<path fill-rule="nonzero" fill="rgb(0%, 67.83905%, 93.728638%)" fill-opacity="1" d="M 19.425781 59.316406 C 19.425781 53.949219 15.074219 49.601562 9.710938 49.601562 C 4.347656 49.601562 0 53.949219 0 59.316406 C 0 64.679688 4.347656 69.027344 9.710938 69.027344 C 15.074219 69.027344 19.425781 64.679688 19.425781 59.316406 Z M 19.425781 59.316406 "></path>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-0" x="5.976" y="62.719"></use>
</g>
<path fill-rule="nonzero" fill="rgb(0%, 67.83905%, 93.728638%)" fill-opacity="1" d="M 67.332031 59.316406 C 67.332031 54.023438 63.042969 49.734375 57.75 49.734375 C 52.460938 49.734375 48.167969 54.023438 48.167969 59.316406 C 48.167969 64.605469 52.460938 68.894531 57.75 68.894531 C 63.042969 68.894531 67.332031 64.605469 67.332031 59.316406 Z M 67.332031 59.316406 "></path>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-1" x="54.222" y="62.719"></use>
</g>
<path fill-rule="nonzero" fill="rgb(0%, 67.83905%, 93.728638%)" fill-opacity="1" d="M 115.328125 59.316406 C 115.328125 54 111.019531 49.691406 105.703125 49.691406 C 100.386719 49.691406 96.078125 54 96.078125 59.316406 C 96.078125 64.632812 100.386719 68.941406 105.703125 68.941406 C 111.019531 68.941406 115.328125 64.632812 115.328125 59.316406 Z M 115.328125 59.316406 "></path>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-2" x="102.104" y="62.719"></use>
</g>
<path fill="none" stroke-width="0.3985" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 9.913 -0.00140625 L 35.19425 -0.00140625 " transform="matrix(1, 0, 0, -1, 9.712, 59.315)"></path>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.3985" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 4.214144 -0.00140625 L 0.643831 1.34625 L 1.819613 -0.00140625 L 0.643831 -1.345156 Z M 4.214144 -0.00140625 " transform="matrix(1, 0, 0, -1, 43.1882, 59.315)"></path>
<path fill="none" stroke-width="0.3985" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 57.81925 -0.00140625 L 83.1005 -0.00140625 " transform="matrix(1, 0, 0, -1, 9.712, 59.315)"></path>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.3985" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 4.212804 -0.00140625 L 0.642491 1.34625 L 1.818273 -0.00140625 L 0.642491 -1.345156 Z M 4.212804 -0.00140625 " transform="matrix(1, 0, 0, -1, 91.09579, 59.315)"></path>
<path fill-rule="nonzero" fill="rgb(0%, 67.83905%, 93.728638%)" fill-opacity="1" d="M 259.0625 36.148438 C 259.0625 30.898438 254.804688 26.640625 249.550781 26.640625 C 244.296875 26.640625 240.039062 30.898438 240.039062 36.148438 C 240.039062 41.402344 244.296875 45.660156 249.550781 45.660156 C 254.804688 45.660156 259.0625 41.402344 259.0625 36.148438 Z M 259.0625 36.148438 "></path>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-3" x="246.157" y="39.555"></use>
</g>
<path fill-rule="nonzero" fill="rgb(0%, 67.83905%, 93.728638%)" fill-opacity="1" d="M 224.101562 9.40625 C 224.101562 4.210938 219.890625 0 214.695312 0 C 209.5 0 205.289062 4.210938 205.289062 9.40625 C 205.289062 14.601562 209.5 18.8125 214.695312 18.8125 C 219.890625 18.8125 224.101562 14.601562 224.101562 9.40625 Z M 224.101562 9.40625 "></path>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-4" x="211.442" y="12.81"></use>
</g>
<path fill-rule="nonzero" fill="rgb(0%, 67.83905%, 93.728638%)" fill-opacity="1" d="M 181.488281 19.660156 C 181.488281 14.410156 177.230469 10.152344 171.976562 10.152344 C 166.722656 10.152344 162.464844 14.410156 162.464844 19.660156 C 162.464844 24.914062 166.722656 29.171875 171.976562 29.171875 C 177.230469 29.171875 181.488281 24.914062 181.488281 19.660156 Z M 181.488281 19.660156 "></path>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-5" x="168.584" y="23.066"></use>
</g>
<path fill-rule="nonzero" fill="rgb(0%, 67.83905%, 93.728638%)" fill-opacity="1" d="M 168.070312 59.316406 C 168.070312 51.027344 161.351562 44.304688 153.0625 44.304688 C 144.773438 44.304688 138.054688 51.027344 138.054688 59.316406 C 138.054688 67.605469 144.773438 74.324219 153.0625 74.324219 C 161.351562 74.324219 168.070312 67.605469 168.070312 59.316406 Z M 168.070312 59.316406 "></path>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-6" x="142.78" y="62.379"></use>
<use xlink:href="#glyph-0-7" x="146.709249" y="62.379"></use>
<use xlink:href="#glyph-0-8" x="150.583705" y="62.379"></use>
<use xlink:href="#glyph-0-9" x="155.565005" y="62.379"></use>
<use xlink:href="#glyph-0-7" x="159.467355" y="62.379"></use>
</g>
<path fill-rule="nonzero" fill="rgb(0%, 67.83905%, 93.728638%)" fill-opacity="1" d="M 181.824219 98.96875 C 181.824219 93.527344 177.417969 89.117188 171.976562 89.117188 C 166.535156 89.117188 162.125 93.527344 162.125 98.96875 C 162.125 104.410156 166.535156 108.816406 171.976562 108.816406 C 177.417969 108.816406 181.824219 104.410156 181.824219 98.96875 Z M 181.824219 98.96875 "></path>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-10" x="168.1" y="102.372"></use>
</g>
<g clip-path="url(#clip-0)">
<path fill-rule="nonzero" fill="rgb(0%, 67.83905%, 93.728638%)" fill-opacity="1" d="M 223.617188 109.226562 C 223.617188 104.296875 219.621094 100.304688 214.695312 100.304688 C 209.769531 100.304688 205.777344 104.296875 205.777344 109.226562 C 205.777344 114.152344 209.769531 118.144531 214.695312 118.144531 C 219.621094 118.144531 223.617188 114.152344 223.617188 109.226562 Z M 223.617188 109.226562 "></path>
</g>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-11" x="212.133" y="112.628"></use>
</g>
<path fill-rule="nonzero" fill="rgb(0%, 67.83905%, 93.728638%)" fill-opacity="1" d="M 257.988281 82.480469 C 257.988281 77.820312 254.210938 74.042969 249.550781 74.042969 C 244.890625 74.042969 241.113281 77.820312 241.113281 82.480469 C 241.113281 87.140625 244.890625 90.917969 249.550781 90.917969 C 254.210938 90.917969 257.988281 87.140625 257.988281 82.480469 Z M 257.988281 82.480469 "></path>
<g fill="rgb(0%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-12" x="247.749" y="85.884"></use>
</g>
<path fill="none" stroke-width="0.3985" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 105.815344 -0.00140625 L 125.077062 -0.00140625 " transform="matrix(1, 0, 0, -1, 9.712, 59.315)"></path>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.3985" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 4.212916 -0.00140625 L 0.642604 1.34625 L 1.818385 -0.00140625 L 0.642604 -1.345156 Z M 4.212916 -0.00140625 " transform="matrix(1, 0, 0, -1, 133.07224, 59.315)"></path>
<path fill="none" stroke-width="0.3985" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 149.897375 13.725156 L 156.764563 28.123594 " transform="matrix(1, 0, 0, -1, 9.712, 59.315)"></path>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.3985" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 4.213928 0.00090911 L 0.642925 1.344622 L 1.816582 0.000067769 L 0.645296 -1.346303 Z M 4.213928 0.00090911 " transform="matrix(0.43048, -0.90254, -0.90254, -0.43048, 165.73759, 32.74113)"></path>
<path fill="none" stroke-width="0.3985" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 171.705969 41.920469 L 192.663 46.951719 " transform="matrix(1, 0, 0, -1, 9.712, 59.315)"></path>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.3985" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 4.214962 -0.00158463 L 0.64161 1.346483 L 1.816798 -0.000315783 L 0.64214 -1.345394 Z M 4.214962 -0.00158463 " transform="matrix(0.9723, -0.23344, -0.23344, -0.9723, 200.70611, 12.76365)"></path>
<path fill="none" stroke-width="0.3985" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 212.604406 44.061094 L 229.705969 30.94 " transform="matrix(1, 0, 0, -1, 9.712, 59.315)"></path>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.3985" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 4.216147 0.000367699 L 0.643158 1.345648 L 1.81743 0.00136405 L 0.64538 -1.346036 Z M 4.216147 0.000367699 " transform="matrix(0.79332, 0.60872, 0.60872, -0.79332, 238.05346, 27.32837)"></path>
<path fill="none" stroke-width="0.3985" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 239.838781 13.455625 L 239.838781 -11.462344 " transform="matrix(1, 0, 0, -1, 9.712, 59.315)"></path>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.3985" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 4.213257 0.00038125 L 0.642945 1.344131 L 1.818726 0.00038125 L 0.642945 -1.347275 Z M 4.213257 0.00038125 " transform="matrix(0, 1, 1, 0, 249.5504, 69.06018)"></path>
<path fill="none" stroke-width="0.3985" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 232.987219 -28.423281 L 214.647375 -42.493594 " transform="matrix(1, 0, 0, -1, 9.712, 59.315)"></path>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.3985" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 4.215313 -0.00118538 L 0.644546 1.345218 L 1.818974 0.000917492 L 0.642324 -1.346465 Z M 4.215313 -0.00118538 " transform="matrix(-0.79332, 0.60872, 0.60872, 0.79332, 225.72372, 100.76312)"></path>
<path fill="none" stroke-width="0.3985" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 196.116125 -47.782656 L 175.014563 -42.71625 " transform="matrix(1, 0, 0, -1, 9.712, 59.315)"></path>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.3985" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 4.21674 -0.000906743 L 0.643006 1.346701 L 1.817664 0.00162298 L 0.642477 -1.345175 Z M 4.21674 -0.000906743 " transform="matrix(-0.9723, -0.23344, -0.23344, 0.9723, 186.3966, 102.43055)"></path>
<path fill="none" stroke-width="0.3985" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 157.936438 -30.583437 L 151.217688 -16.489687 " transform="matrix(1, 0, 0, -1, 9.712, 59.315)"></path>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.3985" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 4.2137 0.00223128 L 0.643386 1.345917 L 1.818199 -0.00213506 L 0.644542 -1.346689 Z M 4.2137 0.00223128 " transform="matrix(-0.43048, -0.90254, -0.90254, 0.43048, 161.66749, 77.35676)"></path>
<g fill="rgb(0%, 100%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-6" x="110.168" y="90.529"></use>
<use xlink:href="#glyph-0-13" x="114.097249" y="90.529"></use>
<use xlink:href="#glyph-0-14" x="116.86486" y="90.529"></use>
</g>
<g fill="rgb(0%, 100%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-15" x="121.567207" y="90.529"></use>
</g>
<g fill="rgb(100%, 0%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-16" x="269.955" y="15.743"></use>
<use xlink:href="#glyph-0-8" x="272.999571" y="15.743"></use>
<use xlink:href="#glyph-0-6" x="277.980871" y="15.743"></use>
<use xlink:href="#glyph-0-7" x="281.91012" y="15.743"></use>
</g>
<g fill="rgb(100%, 50%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-17" x="275.878" y="84.971"></use>
<use xlink:href="#glyph-0-14" x="280.305379" y="84.971"></use>
<use xlink:href="#glyph-0-13" x="285.286679" y="84.971"></use>
<use xlink:href="#glyph-0-13" x="288.05429" y="84.971"></use>
<use xlink:href="#glyph-0-18" x="290.8219" y="84.971"></use>
<use xlink:href="#glyph-0-6" x="293.58951" y="84.971"></use>
<use xlink:href="#glyph-0-18" x="297.51876" y="84.971"></use>
<use xlink:href="#glyph-0-14" x="300.28637" y="84.971"></use>
<use xlink:href="#glyph-0-19" x="305.26767" y="84.971"></use>
<use xlink:href="#glyph-0-20" x="310.802891" y="84.971"></use>
<use xlink:href="#glyph-0-21" x="316.338111" y="84.971"></use>
</g>
<g fill="rgb(100%, 50%, 0%)" fill-opacity="1">
<use xlink:href="#glyph-0-14" x="322.152284" y="84.971"></use>
<use xlink:href="#glyph-0-7" x="327.133584" y="84.971"></use>
</g>
<path fill="none" stroke-width="0.3985" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 118.202062 -20.774844 L 129.264563 -11.638125 " transform="matrix(1, 0, 0, -1, 9.712, 59.315)"></path>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.3985" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 4.2146 -0.00155267 L 0.645505 1.345661 L 1.819701 0.000691098 L 0.643521 -1.343345 Z M 4.2146 -0.00155267 " transform="matrix(0.7709, -0.63684, -0.63684, -0.7709, 137.65232, 72.04611)"></path>
<path fill="none" stroke-width="0.3985" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 259.88175 40.053281 L 249.604406 31.397031 " transform="matrix(1, 0, 0, -1, 9.712, 59.315)"></path>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.3985" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 4.213798 0.000415068 L 0.641896 1.344793 L 1.818488 0.000939598 L 0.644276 -1.344132 Z M 4.213798 0.000415068 " transform="matrix(-0.7647, 0.64433, 0.64433, 0.7647, 260.63218, 26.81195)"></path>
<path fill="none" stroke-width="0.3985" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 262.651281 -23.165469 L 251.541906 -23.165469 " transform="matrix(1, 0, 0, -1, 9.712, 59.315)"></path>
<path fill-rule="nonzero" fill="rgb(0%, 0%, 0%)" fill-opacity="1" stroke-width="0.3985" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 4.216294 0.00050875 L 0.642075 1.344259 L 1.817856 0.00050875 L 0.642075 -1.347148 Z M 4.216294 0.00050875 " transform="matrix(-1, 0, 0, 1, 262.9702, 82.47996)"></path>
<path fill="none" stroke-width="0.3985" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 100%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 158.471594 10.904844 C 162.479406 14.451719 164.784094 21.342344 163.026281 29.975156 C 177.705969 26.916563 189.545813 30.818906 199.530188 42.0025 C 206.049719 29.369688 215.967688 22.998594 230.163 22.326719 C 223.842688 8.334531 225.1005 -4.274844 232.272375 -14.259219 " transform="matrix(1, 0, 0, -1, 9.712, 59.315)"></path>
<path fill-rule="nonzero" fill="rgb(0%, 100%, 0%)" fill-opacity="1" stroke-width="0.3985" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 100%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 3.459066 -0.000593787 C 3.456813 0.89867 2.72597 1.628974 1.829295 1.629646 C 0.927107 1.629981 0.199391 0.902063 0.199056 -0.000125582 C 0.201309 -0.899389 0.929227 -1.627104 1.828827 -1.630365 C 2.72809 -1.628112 3.455806 -0.900193 3.459066 -0.000593787 Z M 3.459066 -0.000593787 " transform="matrix(-0.7488, 0.66273, 0.66273, 0.7488, 168.33273, 48.27833)"></path>
<path fill-rule="nonzero" fill="rgb(0%, 100%, 0%)" fill-opacity="1" stroke-width="0.3985" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(0%, 100%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 4.214248 -0.00188335 L 0.642509 1.34669 L 1.81742 0.00259191 L 0.641798 -1.346234 Z M 4.214248 -0.00188335 " transform="matrix(0.58334, 0.81216, 0.81216, -0.58334, 240.98069, 72.17782)"></path>
<path fill="none" stroke-width="0.3985" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(100%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 228.995031 15.693906 C 211.080969 3.260313 202.170813 -15.642031 204.268469 -40.817812 C 196.545813 -18.356875 181.838781 -5.56 158.522375 -1.013125 C 181.702063 4.3775 196.00675 17.760313 202.924719 40.525938 C 201.280188 14.705625 210.807531 -4.524844 229.799719 -17.161562 " transform="matrix(1, 0, 0, -1, 9.712, 59.315)"></path>
<path fill-rule="nonzero" fill="rgb(100%, 0%, 0%)" fill-opacity="1" stroke-width="0.3985" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(100%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 3.459707 0.000150803 C 3.45705 0.900705 2.727329 1.630643 1.826775 1.627986 C 0.928448 1.628537 0.19851 0.898817 0.197958 0.000489898 C 0.200615 -0.900064 0.927127 -1.627775 1.828663 -1.630554 C 2.729217 -1.627897 3.456928 -0.901385 3.459707 0.000150803 Z M 3.459707 0.000150803 " transform="matrix(0.82149, -0.57014, -0.57014, -0.82149, 238.54469, 43.73436)"></path>
<path fill-rule="nonzero" fill="rgb(100%, 0%, 0%)" fill-opacity="1" stroke-width="0.3985" stroke-linecap="butt" stroke-linejoin="miter" stroke="rgb(100%, 0%, 0%)" stroke-opacity="1" stroke-miterlimit="10" d="M 4.214074 -0.000416357 L 0.644189 1.345044 L 1.816405 -0.000521679 L 0.641875 -1.345153 Z M 4.214074 -0.000416357 " transform="matrix(0.83249, 0.55396, 0.55396, -0.83249, 238.0819, 75.5246)"></path>
</svg>

<p>由上图可知，快慢指针相遇的节点距离环路起始处的距离为P，而\(P = k \bmod loop\_size\)，也就是说从这个相遇节点出发，再走k步即可到达环路起始处，而从链表头到环路起始处的距离也为k，所以我们同时从链表头和相遇节点出发，走过k步之后必然会在环路起始处首次相遇。</p>

<h2 id="代码">代码</h2>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">Solution</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">detectCycle</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">head</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">ListNode</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="n">Optional</span><span class="p">[</span><span class="n">ListNode</span><span class="p">]:</span>
        <span class="k">if</span> <span class="n">head</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
            <span class="k">return</span> <span class="bp">None</span>

        <span class="n">fast</span> <span class="o">=</span> <span class="n">head</span>
        <span class="n">slow</span> <span class="o">=</span> <span class="n">head</span>
        <span class="k">while</span> <span class="n">fast</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
            <span class="n">fast</span> <span class="o">=</span> <span class="n">fast</span><span class="p">.</span><span class="nb">next</span>
            <span class="k">if</span> <span class="n">fast</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
                <span class="n">fast</span> <span class="o">=</span> <span class="n">fast</span><span class="p">.</span><span class="nb">next</span>
            <span class="n">slow</span> <span class="o">=</span> <span class="n">slow</span><span class="p">.</span><span class="nb">next</span>

            <span class="k">if</span> <span class="n">fast</span> <span class="o">==</span> <span class="n">slow</span><span class="p">:</span>
                <span class="n">slow</span> <span class="o">=</span> <span class="n">head</span>
                <span class="k">break</span>

        <span class="k">if</span> <span class="n">fast</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
            <span class="k">return</span> <span class="n">fast</span>

        <span class="n">node1</span> <span class="o">=</span> <span class="n">fast</span>
        <span class="n">node2</span> <span class="o">=</span> <span class="n">slow</span>
        <span class="k">while</span> <span class="n">node1</span> <span class="o">!=</span> <span class="n">node2</span><span class="p">:</span>
            <span class="n">node1</span> <span class="o">=</span> <span class="n">node1</span><span class="p">.</span><span class="nb">next</span>
            <span class="n">node2</span> <span class="o">=</span> <span class="n">node2</span><span class="p">.</span><span class="nb">next</span>

        <span class="k">return</span> <span class="n">node1</span>
</code></pre></div></div>]]&gt;</content><author><name>Rayman Ng</name></author><category term="Journal"><category term="LeetCode"><category term="Cracking-the-Coding-Interview"><summary type="html"><!--[CDATA[题目 Linked List Cycle II]]--></summary></category></category></category></entry><entry><title type="html">160 Intersection of Two Linked Lists</title><link href="https://raymanng.github.io/journal/leetcode/160-Intersection-of-Two-Linked-Lists/" rel="alternate" type="text/html" title="160 Intersection of Two Linked Lists"><published>2025-05-15T00:00:00+08:00</published><updated>2025-05-15T00:00:00+08:00</updated><id>https://raymanng.github.io/journal/leetcode/160%20Intersection%20of%20Two%20Linked%20Lists</id><content type="html" xml:base="https://raymanng.github.io/journal/leetcode/160-Intersection-of-Two-Linked-Lists/"><!--[CDATA[<h2 id="题目"-->题目
<p><a href="https://leetcode.com/problems/intersection-of-two-linked-lists/">Intersection of Two Linked Lists</a></p>

<h2 id="题解">题解</h2>
<p>由下图可以看出，如果两个链表相交的话，在相交节点以及之后的那一部分必然是相同的，而相交节点就是第一个同时位于链表A与链表B的节点。</p>

<pre><code class="language-mermaid">graph LR
    A1 --&gt; A2 --&gt; C1 --&gt; C2 --&gt; C3
    B1--&gt; B2 --&gt; B3 --&gt; C1
    style C1 fill:red
</code></pre>

<p>由于链表A与链表B不一定有相同长度，所以同时遍历两个链表不一定会同时抵达相交节点，但是我们可以运用下面的技巧来解决这个问题：节点1先遍历链表A再遍历链表B，节点2先遍历链表B再遍历链表A，这样节点1与节点2必然会在相交节点上相遇。证明如下：假设链表A的头部到相交节点的距离为a，而链表B的头部到相交节点的距离为b，相交部分的长度为c，因为 \(a + c + b = b + c + a\)，所以节点1与节点2必然在相交节点上相遇。</p>

<h2 id="代码">代码</h2>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">Solution</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">getIntersectionNode</span><span class="p">(</span>
        <span class="n">self</span><span class="p">,</span> <span class="n">headA</span><span class="p">:</span> <span class="n">ListNode</span><span class="p">,</span> <span class="n">headB</span><span class="p">:</span> <span class="n">ListNode</span>
    <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Optional</span><span class="p">[</span><span class="n">ListNode</span><span class="p">]:</span>
        <span class="n">nodeA</span> <span class="o">=</span> <span class="n">headA</span>
        <span class="n">nodeB</span> <span class="o">=</span> <span class="n">headB</span>
        <span class="k">while</span> <span class="n">nodeA</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">nodeB</span><span class="p">:</span>
            <span class="k">if</span> <span class="n">nodeA</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
                <span class="n">nodeA</span> <span class="o">=</span> <span class="n">headB</span>
            <span class="k">else</span><span class="p">:</span>
                <span class="n">nodeA</span> <span class="o">=</span> <span class="n">nodeA</span><span class="p">.</span><span class="nb">next</span>

            <span class="k">if</span> <span class="n">nodeB</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
                <span class="n">nodeB</span> <span class="o">=</span> <span class="n">headA</span>
            <span class="k">else</span><span class="p">:</span>
                <span class="n">nodeB</span> <span class="o">=</span> <span class="n">nodeB</span><span class="p">.</span><span class="nb">next</span>

        <span class="k">return</span> <span class="n">nodeA</span>
</code></pre></div></div>]]&gt;</content><author><name>Rayman Ng</name></author><category term="Journal"><category term="LeetCode"><category term="Cracking-the-Coding-Interview"><summary type="html"><!--[CDATA[题目 Intersection of Two Linked Lists]]--></summary></category></category></category></entry><entry><title type="html">234 Palindrome Linked List</title><link href="https://raymanng.github.io/journal/leetcode/234-Palindrome-Linked-List/" rel="alternate" type="text/html" title="234 Palindrome Linked List"><published>2025-05-09T00:00:00+08:00</published><updated>2025-05-09T00:00:00+08:00</updated><id>https://raymanng.github.io/journal/leetcode/234%20Palindrome%20Linked%20List</id><content type="html" xml:base="https://raymanng.github.io/journal/leetcode/234-Palindrome-Linked-List/"><!--[CDATA[<h2 id="题目"-->题目
<p><a href="https://leetcode.com/problems/palindrome-linked-list/">Palindrome Linked List</a></p>

<h2 id="题解">题解</h2>
<p>因为回文链表从前往后遍历与从后往前遍历得到的结果是一样的，所以如果我们从链表的头尾两端同时向中间遍历的话，就可以检验该链表是否为回文链表。通过运用快慢指针+反转链表的技巧，我们可以在\(O(n)\)的时间复杂度以及\(O(1)\)的空间复杂度以内做到从链表的头尾两端同时向中间遍历。</p>

<p>首先使用快慢指针遍历链表，快指针每次跨过两个节点，慢指针每次跨过一个节点，当快指针到达链表末端时，慢指针恰好指向链表的中间节点。</p>
<div class="language-graphviz highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">digraph</span> <span class="nv">G</span> <span class="p">{</span>
    <span class="p">{</span>
        <span class="n">rank</span><span class="p">=</span><span class="nv">same</span>
        <span class="nv">A</span><span class="o">[</span><span class="n">label</span><span class="p">=</span><span class="s2">"1"</span><span class="o">]</span>
        <span class="nv">B</span><span class="o">[</span><span class="n">label</span><span class="p">=</span><span class="s2">"6"</span><span class="o">]</span>
        <span class="nv">C</span><span class="o">[</span><span class="n">label</span><span class="p">=</span><span class="s2">"4"</span><span class="o">]</span>
        <span class="nv">D</span><span class="o">[</span><span class="n">label</span><span class="p">=</span><span class="s2">"5"</span> <span class="n">color</span><span class="p">=</span><span class="s2">"blue"</span> <span class="n">style</span><span class="p">=</span><span class="s2">"filled"</span><span class="o">]</span>
        <span class="nv">E</span><span class="o">[</span><span class="n">label</span><span class="p">=</span><span class="s2">"4"</span><span class="o">]</span>
        <span class="nv">F</span><span class="o">[</span><span class="n">label</span><span class="p">=</span><span class="s2">"6"</span><span class="o">]</span>
        <span class="nv">G</span><span class="o">[</span><span class="n">label</span><span class="p">=</span><span class="s2">"1"</span> <span class="n">color</span><span class="p">=</span><span class="s2">"red"</span> <span class="n">style</span><span class="p">=</span><span class="s2">"filled"</span><span class="o">]</span>
    <span class="p">}</span>
    <span class="nv">A</span> <span class="o">-&gt;</span> <span class="nv">B</span> <span class="o">-&gt;</span> <span class="nv">C</span> <span class="o">-&gt;</span> <span class="nv">D</span> <span class="o">-&gt;</span> <span class="nv">E</span> <span class="o">-&gt;</span> <span class="nv">F</span> <span class="o">-&gt;</span> <span class="nv">G</span>
    <span class="nv">A</span><span class="p">:</span><span class="nv">n</span> <span class="o">-&gt;</span> <span class="nv">C</span><span class="p">:</span><span class="nv">n</span> <span class="o">-&gt;</span> <span class="nv">E</span><span class="p">:</span><span class="nv">n</span> <span class="o">-&gt;</span> <span class="nv">G</span><span class="p">:</span><span class="nv">n</span> <span class="o">[</span><span class="n">arrowhead</span><span class="p">=</span><span class="s2">"none"</span><span class="p">,</span> <span class="n">color</span><span class="p">=</span><span class="s2">"red"</span><span class="o">]</span>
    <span class="nv">A</span><span class="p">:</span><span class="nv">s</span> <span class="o">-&gt;</span> <span class="nv">B</span><span class="p">:</span><span class="nv">s</span> <span class="o">-&gt;</span> <span class="nv">C</span><span class="p">:</span><span class="nv">s</span> <span class="o">-&gt;</span> <span class="nv">D</span><span class="p">:</span><span class="nv">s</span> <span class="o">[</span><span class="n">arrowhead</span><span class="p">=</span><span class="s2">"none"</span><span class="p">,</span> <span class="n">color</span><span class="p">=</span><span class="s2">"blue"</span><span class="o">]</span>

    <span class="p">{</span>
        <span class="k">node</span><span class="o">[</span><span class="n">shape</span><span class="p">=</span><span class="nv">plain</span><span class="o">]</span>
        <span class="nv">fast</span>
        <span class="nv">slow</span>
    <span class="p">}</span>
    <span class="nv">G</span> <span class="o">-&gt;</span> <span class="nv">fast</span> <span class="o">[</span><span class="n">dir</span><span class="p">=</span><span class="nv">back</span><span class="o">]</span>
    <span class="nv">D</span> <span class="o">-&gt;</span> <span class="nv">slow</span> <span class="o">[</span><span class="n">dir</span><span class="p">=</span><span class="nv">back</span><span class="o">]</span>
<span class="p">}</span>
</code></pre></div></div>

<p>获取中间节点之后，我们把后半段链表逐个节点进行反转，反转之后即可得到链表的末尾节点，此时我们就可以从链表的头尾两端同时向中间遍历以检验该链表是否为回文链表了。</p>
<div class="language-graphviz highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">digraph</span> <span class="nv">G</span> <span class="p">{</span>
    <span class="p">{</span>
        <span class="n">rank</span><span class="p">=</span><span class="nv">same</span>
        <span class="nv">A</span><span class="o">[</span><span class="n">label</span><span class="p">=</span><span class="s2">"1"</span><span class="o">]</span>
        <span class="nv">B</span><span class="o">[</span><span class="n">label</span><span class="p">=</span><span class="s2">"6"</span><span class="o">]</span>
        <span class="nv">C</span><span class="o">[</span><span class="n">label</span><span class="p">=</span><span class="s2">"4"</span><span class="o">]</span>
        <span class="nv">D</span><span class="o">[</span><span class="n">label</span><span class="p">=</span><span class="s2">"5"</span> <span class="n">color</span><span class="p">=</span><span class="s2">"blue"</span> <span class="n">style</span><span class="p">=</span><span class="s2">"filled"</span><span class="o">]</span>
        <span class="nv">E</span><span class="o">[</span><span class="n">label</span><span class="p">=</span><span class="s2">"4"</span><span class="o">]</span>
        <span class="nv">F</span><span class="o">[</span><span class="n">label</span><span class="p">=</span><span class="s2">"6"</span><span class="o">]</span>
        <span class="nv">G</span><span class="o">[</span><span class="n">label</span><span class="p">=</span><span class="s2">"1"</span><span class="o">]</span>
    <span class="p">}</span>
    <span class="nv">A</span> <span class="o">-&gt;</span> <span class="nv">B</span> <span class="o">-&gt;</span> <span class="nv">C</span> <span class="o">-&gt;</span> <span class="nv">D</span>
    <span class="nv">D</span> <span class="o">-&gt;</span> <span class="nv">E</span> <span class="o">-&gt;</span> <span class="nv">F</span> <span class="o">-&gt;</span> <span class="nv">G</span> <span class="o">[</span><span class="n">dir</span><span class="p">=</span><span class="s2">"back"</span> <span class="n">color</span><span class="p">=</span><span class="s2">"red"</span><span class="o">]</span>

    <span class="p">{</span>
        <span class="n">rank</span> <span class="p">=</span> <span class="nv">same</span>
        <span class="k">node</span><span class="o">[</span><span class="n">shape</span><span class="p">=</span><span class="nv">plain</span><span class="o">]</span>
        <span class="nv">head</span>
        <span class="nv">slow</span>
        <span class="nv">tail</span>
    <span class="p">}</span>
    <span class="nv">D</span> <span class="o">-&gt;</span> <span class="nv">slow</span> <span class="o">[</span><span class="n">dir</span><span class="p">=</span><span class="nv">back</span><span class="o">]</span>
    <span class="nv">A</span> <span class="o">-&gt;</span> <span class="nv">head</span> <span class="o">[</span><span class="n">dir</span><span class="p">=</span><span class="nv">back</span><span class="o">]</span>
    <span class="nv">G</span> <span class="o">-&gt;</span> <span class="nv">tail</span> <span class="o">[</span><span class="n">dir</span><span class="p">=</span><span class="nv">back</span><span class="o">]</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="代码">代码</h2>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">Solution</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">isPalindrome</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">head</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">ListNode</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
        <span class="n">fast</span> <span class="o">=</span> <span class="n">head</span>
        <span class="n">slow</span> <span class="o">=</span> <span class="n">head</span>
        <span class="k">while</span> <span class="n">fast</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span> <span class="ow">and</span> <span class="n">fast</span><span class="p">.</span><span class="nb">next</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
            <span class="n">fast</span> <span class="o">=</span> <span class="n">fast</span><span class="p">.</span><span class="nb">next</span><span class="p">.</span><span class="nb">next</span>
            <span class="n">slow</span> <span class="o">=</span> <span class="n">slow</span><span class="p">.</span><span class="nb">next</span>

        <span class="n">middle</span> <span class="o">=</span> <span class="n">slow</span>
        <span class="n">previous</span> <span class="o">=</span> <span class="bp">None</span>
        <span class="n">current</span> <span class="o">=</span> <span class="n">middle</span>
        <span class="k">while</span> <span class="n">current</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
            <span class="n">temp</span> <span class="o">=</span> <span class="n">current</span><span class="p">.</span><span class="nb">next</span>
            <span class="n">current</span><span class="p">.</span><span class="nb">next</span> <span class="o">=</span> <span class="n">previous</span>
            <span class="n">previous</span> <span class="o">=</span> <span class="n">current</span>
            <span class="n">current</span> <span class="o">=</span> <span class="n">temp</span>

        <span class="n">head_node</span> <span class="o">=</span> <span class="n">head</span>
        <span class="n">tail_node</span> <span class="o">=</span> <span class="n">previous</span>
        <span class="n">result</span> <span class="o">=</span> <span class="bp">True</span>
        <span class="k">while</span> <span class="n">tail_node</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
            <span class="k">if</span> <span class="n">head_node</span><span class="p">.</span><span class="n">val</span> <span class="o">!=</span> <span class="n">tail_node</span><span class="p">.</span><span class="n">val</span><span class="p">:</span>
                <span class="n">result</span> <span class="o">=</span> <span class="bp">False</span>
                <span class="k">break</span>
            <span class="n">tail_node</span> <span class="o">=</span> <span class="n">tail_node</span><span class="p">.</span><span class="nb">next</span>
            <span class="n">head_node</span> <span class="o">=</span> <span class="n">head_node</span><span class="p">.</span><span class="nb">next</span>

        <span class="k">return</span> <span class="n">result</span>
</code></pre></div></div>]]&gt;</content><author><name>Rayman Ng</name></author><category term="Journal"><category term="LeetCode"><category term="Cracking-the-Coding-Interview"><summary type="html"><!--[CDATA[题目 Palindrome Linked List]]--></summary></category></category></category></entry><entry><title type="html">445 Add Two Numbers II</title><link href="https://raymanng.github.io/journal/leetcode/445-Add-Two-Numbers-II/" rel="alternate" type="text/html" title="445 Add Two Numbers II"><published>2025-04-29T00:00:00+08:00</published><updated>2025-04-29T00:00:00+08:00</updated><id>https://raymanng.github.io/journal/leetcode/445%20Add%20Two%20Numbers%20II</id><content type="html" xml:base="https://raymanng.github.io/journal/leetcode/445-Add-Two-Numbers-II/"><!--[CDATA[<h2 id="题目"-->题目
<p><a href="https://leetcode.com/problems/add-two-numbers-ii/">Add Two Numbers II</a></p>

<h2 id="题解">题解</h2>
<p>本题可以通过反转链表的方式来将问题转换为更容易求解的<a href="https://leetcode.com/problems/add-two-numbers/">Add Two Numbers</a>问题，也可以借助递归或者栈结构来求解，不过这里将介绍另外的特殊解法：我们可以直接将两个链表从最高位开始按位相加（先不处理进位），并构造一个从最低位指向最高位的链表，然后再一边处理进位一边反转链表。</p>
<pre><code class="language-mermaid">graph TB
    subgraph numbers
        千位1[9] --&gt; 百位1[8] --&gt; 十位1[7] --&gt; 个位1[6]
        千位2[5] --&gt; 百位2[4] --&gt; 十位2[3] --&gt; 个位2[2]
    end
    subgraph sum
        direction RL
        个位和[8] --&gt; 十位和[10] --&gt; 百位和[12] --&gt; 千位和[14]
    end
    subgraph result
        万位[1] --&gt; 千位[5] --&gt; 百位[3] --&gt; 十位[0] --&gt; 个位[8]
    end
    numbers -- 直接相加 --&gt; sum -- 处理进位并反转 --&gt; result
</code></pre>

<h2 id="代码">代码</h2>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">Solution</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">countNodes</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">head</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">ListNode</span><span class="p">]):</span>
        <span class="n">node</span> <span class="o">=</span> <span class="n">head</span>
        <span class="n">count</span> <span class="o">=</span> <span class="mi">0</span>
        <span class="k">while</span> <span class="n">node</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
            <span class="n">count</span> <span class="o">+=</span> <span class="mi">1</span>
            <span class="n">node</span> <span class="o">=</span> <span class="n">node</span><span class="p">.</span><span class="nb">next</span>
        <span class="k">return</span> <span class="n">count</span>

    <span class="k">def</span> <span class="nf">addTwoNumbers</span><span class="p">(</span>
        <span class="n">self</span><span class="p">,</span> <span class="n">l1</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">ListNode</span><span class="p">],</span> <span class="n">l2</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">ListNode</span><span class="p">]</span>
    <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Optional</span><span class="p">[</span><span class="n">ListNode</span><span class="p">]:</span>
        <span class="n">size1</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">countNodes</span><span class="p">(</span><span class="n">l1</span><span class="p">)</span>
        <span class="n">size2</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">countNodes</span><span class="p">(</span><span class="n">l2</span><span class="p">)</span>
        <span class="k">if</span> <span class="n">size2</span> <span class="o">&gt;</span> <span class="n">size1</span><span class="p">:</span>
            <span class="n">l1</span><span class="p">,</span> <span class="n">l2</span> <span class="o">=</span> <span class="n">l2</span><span class="p">,</span> <span class="n">l1</span>
            <span class="n">size1</span><span class="p">,</span> <span class="n">size2</span> <span class="o">=</span> <span class="n">size2</span><span class="p">,</span> <span class="n">size1</span>
        <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="n">size1</span> <span class="o">-</span> <span class="n">size2</span><span class="p">):</span>
            <span class="n">l2</span> <span class="o">=</span> <span class="nc">ListNode</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">l2</span><span class="p">)</span>

        <span class="n">node1</span> <span class="o">=</span> <span class="n">l1</span>
        <span class="n">node2</span> <span class="o">=</span> <span class="n">l2</span>
        <span class="n">head_node</span> <span class="o">=</span> <span class="bp">None</span>
        <span class="k">while</span> <span class="n">node1</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span> <span class="ow">and</span> <span class="n">node2</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
            <span class="nb">sum</span> <span class="o">=</span> <span class="n">node1</span><span class="p">.</span><span class="n">val</span> <span class="o">+</span> <span class="n">node2</span><span class="p">.</span><span class="n">val</span>
            <span class="k">if</span> <span class="n">head_node</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
                <span class="n">head_node</span> <span class="o">=</span> <span class="nc">ListNode</span><span class="p">(</span><span class="nb">sum</span><span class="p">)</span>
            <span class="k">else</span><span class="p">:</span>
                <span class="n">head_node</span> <span class="o">=</span> <span class="nc">ListNode</span><span class="p">(</span><span class="nb">sum</span><span class="p">,</span> <span class="n">head_node</span><span class="p">)</span>
            <span class="n">node1</span> <span class="o">=</span> <span class="n">node1</span><span class="p">.</span><span class="nb">next</span>
            <span class="n">node2</span> <span class="o">=</span> <span class="n">node2</span><span class="p">.</span><span class="nb">next</span>

        <span class="n">previous_node</span> <span class="o">=</span> <span class="bp">None</span>
        <span class="n">digit_node</span> <span class="o">=</span> <span class="n">head_node</span>
        <span class="n">carry</span> <span class="o">=</span> <span class="mi">0</span>
        <span class="k">while</span> <span class="n">digit_node</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
            <span class="nb">sum</span> <span class="o">=</span> <span class="n">digit_node</span><span class="p">.</span><span class="n">val</span> <span class="o">+</span> <span class="n">carry</span>
            <span class="k">if</span> <span class="nb">sum</span> <span class="o">&gt;=</span> <span class="mi">10</span><span class="p">:</span>
                <span class="n">carry</span> <span class="o">=</span> <span class="mi">1</span>
            <span class="k">else</span><span class="p">:</span>
                <span class="n">carry</span> <span class="o">=</span> <span class="mi">0</span>
            <span class="n">digit_node</span><span class="p">.</span><span class="n">val</span> <span class="o">=</span> <span class="nb">sum</span> <span class="o">%</span> <span class="mi">10</span>

            <span class="n">next_node</span> <span class="o">=</span> <span class="n">digit_node</span><span class="p">.</span><span class="nb">next</span>
            <span class="n">digit_node</span><span class="p">.</span><span class="nb">next</span> <span class="o">=</span> <span class="n">previous_node</span>
            <span class="n">previous_node</span> <span class="o">=</span> <span class="n">digit_node</span>
            <span class="n">digit_node</span> <span class="o">=</span> <span class="n">next_node</span>

        <span class="n">result_node</span> <span class="o">=</span> <span class="n">previous_node</span>
        <span class="k">if</span> <span class="n">carry</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
            <span class="n">result_node</span> <span class="o">=</span> <span class="nc">ListNode</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">previous_node</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">result_node</span>
</code></pre></div></div>]]&gt;</content><author><name>Rayman Ng</name></author><category term="Journal"><category term="LeetCode"><category term="Cracking-the-Coding-Interview"><summary type="html"><!--[CDATA[题目 Add Two Numbers II]]--></summary></category></category></category></entry><entry><title type="html">237 Delete Node in a Linked List</title><link href="https://raymanng.github.io/journal/leetcode/237-Delete-Node-in-a-Linked-List/" rel="alternate" type="text/html" title="237 Delete Node in a Linked List"><published>2025-04-24T00:00:00+08:00</published><updated>2025-04-24T00:00:00+08:00</updated><id>https://raymanng.github.io/journal/leetcode/237%20Delete%20Node%20in%20a%20Linked%20List</id><content type="html" xml:base="https://raymanng.github.io/journal/leetcode/237-Delete-Node-in-a-Linked-List/"><!--[CDATA[<h2 id="题目"-->题目
<p><a href="https://leetcode.com/problems/delete-node-in-a-linked-list/">Delete Node in a Linked List</a></p>

<h2 id="题解">题解</h2>
<p>如果能观察到下列事项，我们自然就能拼出答案来了：</p>
<ol>
  <li>若想在单向链表中删除一个节点，我们需要获取该节点的前一个节点的指针，由于我们只有待删除节点的指针，所以我们只能删除待删除节点后面的节点。</li>
  <li>节点只是一个存储数据的容器，删除某节点在逻辑上等同于删除该节点中的数据。</li>
  <li>节点之间的数据是可以交换的，我们可以把其他节点的数据赋给待删除节点。</li>
</ol>

<h2 id="代码">代码</h2>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">Solution</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">deleteNode</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">node</span><span class="p">):</span>
        <span class="n">next_node</span> <span class="o">=</span> <span class="n">node</span><span class="p">.</span><span class="nb">next</span>
        <span class="n">node</span><span class="p">.</span><span class="n">val</span> <span class="o">=</span> <span class="n">next_node</span><span class="p">.</span><span class="n">val</span>
        <span class="n">node</span><span class="p">.</span><span class="nb">next</span> <span class="o">=</span> <span class="n">next_node</span><span class="p">.</span><span class="nb">next</span>
</code></pre></div></div>]]&gt;</content><author><name>Rayman Ng</name></author><category term="Journal"><category term="LeetCode"><category term="Cracking-the-Coding-Interview"><summary type="html"><!--[CDATA[题目 Delete Node in a Linked List]]--></summary></category></category></category></entry><entry><title type="html">86 Partition List</title><link href="https://raymanng.github.io/journal/leetcode/86-Partition-List/" rel="alternate" type="text/html" title="86 Partition List"><published>2025-04-24T00:00:00+08:00</published><updated>2025-04-24T00:00:00+08:00</updated><id>https://raymanng.github.io/journal/leetcode/86%20Partition%20List</id><content type="html" xml:base="https://raymanng.github.io/journal/leetcode/86-Partition-List/"><!--[CDATA[<h2 id="题目"-->题目
<p><a href="https://leetcode.com/problems/partition-list/">Partition List</a></p>

<h2 id="题解">题解</h2>
<p>由于链表插入/删除首尾节点的时间/空间复杂度均为\(O(1)\)，所以我们不需要像分割数组那样分配额外空间。</p>

<p>首先创建左右两个链表，然后遍历输入的链表，把每个节点裁剪出来插入这两个链表，最后把左右链表拼接起来即可。</p>

<h2 id="代码">代码</h2>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">Solution</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">partition</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">head</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">ListNode</span><span class="p">],</span> <span class="n">x</span><span class="p">:</span> <span class="nb">int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Optional</span><span class="p">[</span><span class="n">ListNode</span><span class="p">]:</span>
        <span class="n">left_list_head</span> <span class="o">=</span> <span class="bp">None</span>
        <span class="n">left_list_tail</span> <span class="o">=</span> <span class="bp">None</span>
        <span class="n">right_list_head</span> <span class="o">=</span> <span class="bp">None</span>
        <span class="n">right_list_tail</span> <span class="o">=</span> <span class="bp">None</span>

        <span class="n">current</span> <span class="o">=</span> <span class="n">head</span>
        <span class="k">while</span> <span class="n">current</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
            <span class="nb">next</span> <span class="o">=</span> <span class="n">current</span><span class="p">.</span><span class="nb">next</span>
            <span class="n">current</span><span class="p">.</span><span class="nb">next</span> <span class="o">=</span> <span class="bp">None</span>
            <span class="k">if</span> <span class="n">current</span><span class="p">.</span><span class="n">val</span> <span class="o">&lt;</span> <span class="n">x</span><span class="p">:</span>
                <span class="k">if</span> <span class="n">left_list_head</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
                    <span class="n">left_list_head</span> <span class="o">=</span> <span class="n">current</span>
                    <span class="n">left_list_tail</span> <span class="o">=</span> <span class="n">current</span>
                <span class="k">else</span><span class="p">:</span>
                    <span class="n">left_list_tail</span><span class="p">.</span><span class="nb">next</span> <span class="o">=</span> <span class="n">current</span>
                    <span class="n">left_list_tail</span> <span class="o">=</span> <span class="n">current</span>
            <span class="k">else</span><span class="p">:</span>
                <span class="k">if</span> <span class="n">right_list_head</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
                    <span class="n">right_list_head</span> <span class="o">=</span> <span class="n">current</span>
                    <span class="n">right_list_tail</span> <span class="o">=</span> <span class="n">current</span>
                <span class="k">else</span><span class="p">:</span>
                    <span class="n">right_list_tail</span><span class="p">.</span><span class="nb">next</span> <span class="o">=</span> <span class="n">current</span>
                    <span class="n">right_list_tail</span> <span class="o">=</span> <span class="n">current</span>
            <span class="n">current</span> <span class="o">=</span> <span class="nb">next</span>

        <span class="k">if</span> <span class="n">left_list_head</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
            <span class="k">return</span> <span class="n">right_list_head</span>

        <span class="n">left_list_tail</span><span class="p">.</span><span class="nb">next</span> <span class="o">=</span> <span class="n">right_list_head</span>
        <span class="k">return</span> <span class="n">left_list_head</span>
</code></pre></div></div>]]&gt;</content><author><name>Rayman Ng</name></author><category term="Journal"><category term="LeetCode"><category term="Cracking-the-Coding-Interview"><summary type="html"><!--[CDATA[题目 Partition List]]--></summary></category></category></category></entry><entry><title type="html">19 Remove Nth Node From End of List</title><link href="https://raymanng.github.io/journal/leetcode/19-Remove-Nth-Node-From-End-of-List/" rel="alternate" type="text/html" title="19 Remove Nth Node From End of List"><published>2025-04-22T00:00:00+08:00</published><updated>2025-04-22T00:00:00+08:00</updated><id>https://raymanng.github.io/journal/leetcode/19%20Remove%20Nth%20Node%20From%20End%20of%20List</id><content type="html" xml:base="https://raymanng.github.io/journal/leetcode/19-Remove-Nth-Node-From-End-of-List/"><!--[CDATA[<h2 id="题目"-->题目
<p><a href="https://leetcode.com/problems/remove-nth-node-from-end-of-list/">Remove Nth Node From End of List</a></p>

<h2 id="题解">题解</h2>
<p>双指针技巧是常见的处理链表的手法，这里我们运用其中的快慢指针方法来解题：首先让一个快指针从head开始提前移动k个节点，然后把慢指针初始化为head，再让两个指针同时前进。当快指针到达链表末尾的Null时，慢指针就会指向倒数第k个节点。</p>

<h2 id="代码">代码</h2>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">Solution</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">removeNthFromEnd</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">head</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">ListNode</span><span class="p">],</span> <span class="n">n</span><span class="p">:</span> <span class="nb">int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Optional</span><span class="p">[</span><span class="n">ListNode</span><span class="p">]:</span>
        <span class="n">forward_node</span> <span class="o">=</span> <span class="n">head</span>
        <span class="n">count</span> <span class="o">=</span> <span class="mi">0</span>
        <span class="k">while</span> <span class="n">forward_node</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span> <span class="ow">and</span> <span class="n">count</span> <span class="o">&lt;</span> <span class="n">n</span><span class="p">:</span>
            <span class="n">forward_node</span> <span class="o">=</span> <span class="n">forward_node</span><span class="p">.</span><span class="nb">next</span>
            <span class="n">count</span> <span class="o">+=</span> <span class="mi">1</span>

        <span class="n">previous</span> <span class="o">=</span> <span class="bp">None</span>
        <span class="n">current</span> <span class="o">=</span> <span class="n">head</span>
        <span class="k">while</span> <span class="n">forward_node</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
            <span class="n">previous</span> <span class="o">=</span> <span class="n">current</span>
            <span class="n">current</span> <span class="o">=</span> <span class="n">current</span><span class="p">.</span><span class="nb">next</span>
            <span class="n">forward_node</span> <span class="o">=</span> <span class="n">forward_node</span><span class="p">.</span><span class="nb">next</span>

        <span class="k">if</span> <span class="n">previous</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
            <span class="n">head</span> <span class="o">=</span> <span class="n">head</span><span class="p">.</span><span class="nb">next</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="n">previous</span><span class="p">.</span><span class="nb">next</span> <span class="o">=</span> <span class="n">current</span><span class="p">.</span><span class="nb">next</span>

        <span class="k">return</span> <span class="n">head</span>
</code></pre></div></div>]]&gt;</content><author><name>Rayman Ng</name></author><category term="Journal"><category term="LeetCode"><summary type="html"><!--[CDATA[题目 Remove Nth Node From End of List]]--></summary></category></category></entry><entry><title type="html">73 Set Matrix Zeroes</title><link href="https://raymanng.github.io/journal/leetcode/73-Set-Matrix-Zeroes/" rel="alternate" type="text/html" title="73 Set Matrix Zeroes"><published>2025-04-16T00:00:00+08:00</published><updated>2025-04-16T00:00:00+08:00</updated><id>https://raymanng.github.io/journal/leetcode/73%20Set%20Matrix%20Zeroes</id><content type="html" xml:base="https://raymanng.github.io/journal/leetcode/73-Set-Matrix-Zeroes/"><!--[CDATA[<h2 id="题目"-->题目
<p><a href="https://leetcode.com/problems/set-matrix-zeroes/">Set Matrix Zeroes</a></p>

<h2 id="题解">题解</h2>
<p>首先需要注意，我们不能在扫描完整个矩阵之前进行清零操作，因为这样会把后面未扫描到的矩阵元素置零，从而可能导致零值被错误地扩散出去。</p>

<p>在空间复杂度必须为\(O(1)\)的限制下，我们只能在矩阵内存储需要清零的行/列信息。一个方法是在首行首列存储需要清零的行和列，但是这样会导致首行首列本身是否需要清零的信息被映射到同一个位置<code class="language-plaintext highlighter-rouge">matrix[0][0]</code>而无法区别开来，所以我们需要两个额外的变量来存储这两项信息。</p>

<h2 id="代码">代码</h2>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">Solution</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">setZeroes</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">matrix</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="n">List</span><span class="p">[</span><span class="nb">int</span><span class="p">]])</span> <span class="o">-&gt;</span> <span class="bp">None</span><span class="p">:</span>
        <span class="n">row_size</span> <span class="o">=</span> <span class="nf">len</span><span class="p">(</span><span class="n">matrix</span><span class="p">)</span>
        <span class="n">column_size</span> <span class="o">=</span> <span class="nf">len</span><span class="p">(</span><span class="n">matrix</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>

        <span class="n">first_row_has_0</span> <span class="o">=</span> <span class="nf">any</span><span class="p">([</span><span class="bp">True</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">matrix</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="n">x</span> <span class="o">==</span> <span class="mi">0</span><span class="p">])</span>
        <span class="n">first_column_has_0</span> <span class="o">=</span> <span class="nf">any</span><span class="p">(</span>
            <span class="p">[</span><span class="bp">True</span> <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="n">row_size</span><span class="p">)</span> <span class="k">if</span> <span class="n">matrix</span><span class="p">[</span><span class="n">row</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="mi">0</span><span class="p">]</span>
        <span class="p">)</span>

        <span class="k">for</span> <span class="n">row</span><span class="p">,</span> <span class="n">array</span> <span class="ow">in</span> <span class="nf">enumerate</span><span class="p">(</span><span class="n">matrix</span><span class="p">):</span>
            <span class="k">for</span> <span class="n">column</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="nf">enumerate</span><span class="p">(</span><span class="n">array</span><span class="p">):</span>
                <span class="k">if</span> <span class="n">value</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
                    <span class="n">matrix</span><span class="p">[</span><span class="n">row</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span>
                    <span class="n">matrix</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="n">column</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span>

        <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">row_size</span><span class="p">):</span>
            <span class="k">if</span> <span class="n">matrix</span><span class="p">[</span><span class="n">row</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
                <span class="n">matrix</span><span class="p">[</span><span class="n">row</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">*</span> <span class="n">column_size</span>

        <span class="k">for</span> <span class="n">column</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">column_size</span><span class="p">):</span>
            <span class="k">if</span> <span class="n">matrix</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="n">column</span><span class="p">]</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
                <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="n">row_size</span><span class="p">):</span>
                    <span class="n">matrix</span><span class="p">[</span><span class="n">row</span><span class="p">][</span><span class="n">column</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span>

        <span class="k">if</span> <span class="n">first_row_has_0</span><span class="p">:</span>
            <span class="n">matrix</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">*</span> <span class="n">column_size</span>
        <span class="k">if</span> <span class="n">first_column_has_0</span><span class="p">:</span>
            <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="n">row_size</span><span class="p">):</span>
                <span class="n">matrix</span><span class="p">[</span><span class="n">row</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span>
</code></pre></div></div>]]&gt;</content><author><name>Rayman Ng</name></author><category term="Journal"><category term="LeetCode"><category term="Cracking-the-Coding-Interview"><summary type="html"><!--[CDATA[题目 Set Matrix Zeroes]]--></summary></category></category></category></entry></feed></body></html>