LeetCode高頻題 鍊錶(四)

2021-10-02 13:18:32 字數 2248 閱讀 2862

我們講解的題目都是leetcode上經典的題目,而且我們的解答一定也是最簡單最經典的。今天帶來兩道關於鍊錶的經典題。本期所用的鍊錶的資料結構均如下:

public

class

listnode

}

題意:給定乙個單鏈表 l:l0→l1→…→ln-1→ln ,

將其重新排列後變為: l0→ln→l1→ln-1→l2→ln-2→…

你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。如圖:

這道題是leetcode經典的繞來繞去的題目,我們來看一下粉絲投稿的**是怎麼樣的:

listnode tailnode=null;

public

void

reorderlist

(listnode head)

listnode afternode = firstnode.next;

firstnode.next = lastnode;

lastnode.next = afternode;

reorderlist

(afternode)

;}

還不錯是不是,用了遞迴的思想,每一次處理第乙個結點和最後乙個結點,然後遞迴操作。邊界條件也處理的很棒,用了乙個tailnode巧妙的找到了最後乙個結點,很棒。但是有沒有更直觀的解答呢?有!

以1->2->3->4->5->6為例,我們先找到中間的結點3,然後反轉3後面的鍊錶變成1->2->3->6->5->4。然後依次連線1->6,2->5,3->4,就可以了。我們來看**:

public

void

reorderlist2

(listnode head)

// 找到中間的結點

listnode slow = head,fast=head;

while

(fast != null && fast.next != null)

//反轉後面的結點 1->2->3->4->5->6 to 1->2->3->6->5->4

listnode head2 =

reverse

(slow.next)

; slow.next = null;

//開始乙個乙個連線 1->2->3->6->5->4 to 1->6->2->5->3->4

while

(head != null && head2 != null)

}private listnode reverse

(listnode n)

return prev;

}

這一種方法是不是清晰很多,雖然**更長,但是更好理解,可以在紙上演算。

題意:在 o(n log n) 時間複雜度和常數級空間複雜度下,對鍊錶進行排序。如圖:

}我們可以看到merge部分就是合併兩個有序鍊錶的過程。

明天給大家帶來鍊錶的最後部分,鍊錶和樹結合的題目。再之後,應粉絲的要求,我們開始講解動態規劃的題目。

LeetCode高頻題 鍊錶(一)

我開了乙個leetcode會員,選擇了一些高頻率題目。這個系列是希望幫助大家每天花30分鐘的題目了解面試高頻題,讓大家面試更加游刃有餘。本期我們開始講解鍊錶的題目,先介紹幾道簡單題熱熱身。本期所用的鍊錶的資料結構均如下 public class listnode 題意 刪除鍊錶中等於給定值 val ...

鍊錶高頻演算法題

class solutionif l2 listnode dummy new listnode listnode res dummy res next null while l1 l2 else if l1 if l2 return dummy next class solution listnod...

leetcode23合併K個鍊錶 高頻題

合併 k 個排序鍊錶,返回合併後的排序鍊錶。請分析和描述演算法的複雜度。示例 輸入 1 4 5,1 3 4,2 6 輸出 1 1 2 3 4 4 5 6 乙個較為合適的方法,即最小堆來做。先存在lists.length個數的最小堆,每次取最小的元素出來,再鏈上新的鍊錶。definition for ...