1. 程式人生 > >leetcode連結串列問題總結

leetcode連結串列問題總結

最近一週下班時間在做leetcode上習題,自己的演算法知識一直不是強項,但是做了50道題之後,發現leetcode上面的題目難度不是很大,但是非常注重細節(通常某個case沒考慮到就到多提交好幾次)和基礎。由於連結串列部分的題先做完了,所以先總結下連結串列相關的求解思路。


截止到目前,list相關的題目就全部在上面了。

解題方法還是有規律的,一般看到“連結串列中第K個“這樣字眼,首先就要考慮是否需要一前一後兩個指標解決。

並且要善於使用二級指標,凡是需要用到prev指標的地方都可以用二級指標解決,依稀記得在哪個地方看過linus torvalds大牛說使用prev指標解決連結串列問題的的都是沒有真正理解指標。關於二級指標問題,可以看看陳皓大俠的這篇文章

http://coolshell.cn/articles/8990.html

部分題之間都是有聯絡的。例如:

兩道linked list cycle相關的題,一個是判斷連結串列是否有環,一個是找出環的起始結點。判斷是否有環的解法可以見我的這篇文章click me,找到環的起始結點可以理解為找兩條連結串列的交叉點(這點稍後會寫部落格介紹)。

個人覺得比較有意思的是連結串列的merge sort相關的題目,看過網上的一些解法,都是遞迴式的類似陣列由頂至底的歸併排序,如果讀過Sedgewick的<Algorithm>這本書,就會知道書中還介紹了由底至頂的歸併,並且更合適與連結串列排序。

話說我第一次寫由底至頂的連結串列歸併時,略感複雜,索性看了一下std::list的sort方法,真是太驚訝了,很讚的方法,反正我是沒想到,這個後面也會專一寫篇部落格。

相關推薦

leetcode 連結串列總結

題目型別上主要分為對連結串列重新排列,刪除重複,刪除給定值,反轉,排序。 技巧上會反轉,排序。 陣列指標這個比較bug的,能ac,但效率不高,非常直觀得解很多題目,優化技巧上可以通過realloc來一邊前進一邊擴充套件分配陣列大小,而不必先走一趟得到連結串列長度,再分

leetcode連結串列問題總結

最近一週下班時間在做leetcode上習題,自己的演算法知識一直不是強項,但是做了50道題之後,發現leetcode上面的題目難度不是很大,但是非常注重細節(通常某個case沒考慮到就到多提交好幾次)和基礎。由於連結串列部分的題先做完了,所以先總結下連結串列相關的求解思路。

leetcode 連結串列

連結串列結構 struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} };   leetcode 206 反轉一個單鏈表。 示例:

其他型別的連結串列總結

java裡LinkedList底層是雙向連結串列 Vector:底層是陣列,執行緒安全,但被ArrayList淘汰 ArrayList:底層是陣列,執行緒不安全 LinkedList:底層是雙向連結串列 -----------------------------------------------

Leetcode ---- 連結串列簡單題

複習了一下連結串列。下面做了一些簡單題。   237. 刪除連結串列中的元素 題目: 請編寫一個函式,使其可以刪除某個連結串列中給定的(非末尾)節點,你將只被給定要求被刪除的節點。 現有一個連結串列 -- head = [4,5,1,9],它可以表示

Leetcode - 連結串列專題 - 148

在 O(n log n) 時間複雜度和常數級空間複雜度下,對連結串列進行排序。 示例 1: 輸入: 4->2->1->3 輸出: 1->2->3->4 示例 2: 輸入: -1->5->3->4-&

Leetcode - 連結串列專題 - 328

給定一個單鏈表,把所有的奇數節點和偶數節點分別排在一起。請注意,這裡的奇數節點和偶數節點指的是節點編號的奇偶性,而不是節點的值的奇偶性。 請嘗試使用原地演算法完成。你的演算法的空間複雜度應為 O(1),時間複雜度應為 O(nodes),nodes 為節點總數。 示例 1: 輸入: 1-&

Leetcode - 連結串列專題 - 876

給定一個帶有頭結點 head 的非空單鏈表,返回連結串列的中間結點。 如果有兩個中間結點,則返回第二個中間結點。   示例 1: 輸入:[1,2,3,4,5] 輸出:此列表中的結點 3 (序列化形式:[3,4,5]) 返回的結點值為 3 。 (測評系統對

Leetcode - 連結串列專題 - 234

請判斷一個連結串列是否為迴文連結串列。 示例 1: 輸入: 1->2 輸出: false 示例 2: 輸入: 1->2->2->1 輸出: true 進階: 你能否用 O(n) 時間複雜度和 O(1) 空間複雜度解決此題? # Defini

LeetCode 連結串列操作相關(一)

連結串列操作對於我來說是一個相對薄弱的環節,需要好好練習。 一、刪除連結串列中的節點 刪除指定節點這種題目是連結串列的基本操作,本題題目如下: 請編寫一個函式,使其可以刪除某個連結串列中給定的(非末尾)節點,你將只被給定要求被刪除的節點。 現有一個連結串列 -- he

其它形式連結串列總結

一、雙向列表 1、定義 在雙向連結串列的結點中有兩個指標域,其一指向直接後繼,另一指向直接前驅,可如下描述 //庫函式標頭檔案包含 #include<stdio.h> #inclu

LeetCode 連結串列翻轉相關(24 25)

思路 連結串列反轉這種題,上個星期我還是不會做的,但是自從學會了前插法,寫起來就遊刃有餘的。 下面介紹下前插法 新建一個空節點作為反轉連結串列的表頭 將待反轉連結串列的頭結點取出,用一個指標指向頭結點的下一個結點,然後將頭結點指向新連結串列的表頭 新連結串列的

(leetcode)連結串列排序,時間(nlogn)空間 (1)

只有歸併排序滿足要求 public class Solution { public ListNode findMiddle (ListNode head){ ListNode chaser = head; ListNode

玩轉演算法面試:(五)LeetCode連結串列類問題

在連結串列中穿針引線 連結串列和陣列都是線性結構,但是連結串列和陣列的不同在於陣列可以隨機的對於資料進行訪問。給出索引。可以以O(1)的時間複雜度迅速訪問到該元素。 連結串列只能從頭指標開始。 next指標指向哪裡? 206. Reverse Linked List

leetcode 連結串列 兩數相加

1 # Definition for singly-linked list. 2 class ListNode: 3 def __init__(self, x): 4 self.val = x 5 self.next = None 6 7 8 cla

LeetCode連結串列篇C++ [逆序、迴文、逆序II]

1. 關鍵點 結點定義 //Definition for singly-linked list. struct ListNode { int val; ListNode *ne

leetcode連結串列題--刪除連結串列的倒數第N個節點(java實現)

原題 給定一個連結串列,刪除連結串列的倒數第 n 個節點,並且返回連結串列的頭結點。 示例: 給定一個連結串列: 1->2->3->4->5, 和 n = 2. 當刪除了

Python實現LeetCode連結串列類演算法(例子:Merge k Sorted Lists)

連結串列的演算法關鍵點:新建立一個頭結點,並且將這個節點賦值給另外的連結串列物件來完成操作。 例如19. Remove Nth Node From End of List class Soluti

leetcode 連結串列1

Given a singly linked list L: L 0→L 1→…→L n-1→L n,reorder it to: L 0→L n →L 1→L n-1→L 2→L n-2→…You must do this in-place without altering

leetcode +連結串列模擬數字相加,連結串列反轉

點選開啟連結//將連結串列反轉,低位在前 class Solution { public: ListNode* addTwoNumbers(ListNode* l1, ListNode* l2)