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

leetcode 連結串列總結

題目型別上主要分為對連結串列重新排列,刪除重複,刪除給定值,反轉,排序。

技巧上會反轉,排序。

陣列指標這個比較bug的,能ac,但效率不高,非常直觀得解很多題目,優化技巧上可以通過realloc來一邊前進一邊擴充套件分配陣列大小,而不必先走一趟得到連結串列長度,再分配。

2      AddTwo Numbers  23.6%      Medium

兩個連結串列相加,第一個,第二個數分別為個十百千萬,依次。

迴圈while(p1&& p2), 訊號量判斷進位,其他沒什麼要注意的。時間O(n),空間O(1)

19    RemoveNth Node From End of List       29.9%      Easy

刪除連結串列中倒數第n個節點

兩個指標,讓一個先走n(還是n-1步?畫圖舉例看看),其他細節好處理。時間O(n), 空間O(1)

21    MergeTwo Sorted Lists  35.8%      Easy

將兩個有序連結串列合併成一個有序連結串列

迴圈while(p1&& p2) 哪個小先接哪個,走完即可時間O(n), 空間O(1)

23    Mergek Sorted Lists       23.7%      Hard

24    SwapNodes in Pairs        35.6%      Easy

成對交換節點

Given 1->2->3->4, you should return the list as2->1->4->3.

有兩種方法:(1)交換,前進一步,再交換,注意要判斷是否有next(這種沒寫過,寫一遍)(2)指標陣列把每個數都存下來,成對交換,再連起來,這個要遍歷3次。第一種方法時間O(n), 空間O(1)

25    ReverseNodes in k-Group      27.9%      Hard

61    RotateList       23.1%      Medium

快慢指標,找到給定節點的前一個節點p,記錄新頭節點,pnext置空,快指標指向尾節點和原頭節點相連,其他沒什麼需要注意的了時間O(n),空間O(1)

82    RemoveDuplicates from Sorted List II   27.2%      Medium

再做一遍,刪除有序連結串列中相同值的節點,全刪除。

For example,

Given 1->2->3->3->4->4->5, return1->2->5.

Given 1->1->1->2->3, return 2->3.

需要兩個指標prepp的處理同第83題,pre來刪除p的結果。其他都是細節了,時間O(n), 空間O(1)

83    RemoveDuplicates from Sorted List      37.1%      Easy

刪除有序連結串列中相同值的節點。保留一個

For example,

Given 1->1->2, return 1->2.

Given 1->1->2->3->3, return 1->2->3.

節點pnext節點值相同,刪除next,不同,前進。不是迭代過程中預設前進,這點需要判斷,和一般的連結串列題有點不同。時間O(n),空間O(1)

86    PartitionList    29.8%      Medium

連結串列根據給定值順序進行調整。

For example,

Given 1->4->3->2->5->2 and x = 3,

return 1->2->2->4->3->5.

設定兩個連結串列p1p2,小於給定值的放p1,大於放p2,最後連在一起,這題和21題有點像。時間O(n), 空間O(1)

92    ReverseLinked List II       28.2%      Medium

給定值mn,將連結串列中第m和第n節點之間的所有節點順序進行反轉

Given 1->2->3->4->5->NULL, m = 2 and n = 4,

return 1->4->3->2->5->NULL.

有兩種方法:(1)找到nm這兩個節點,反轉的方法參照206題,需要多個指標記錄邊界的情況(沒寫過,要寫一遍)。(2)用指標陣列記錄所有節點,最後重新拼接。

方法1時間O(n), 空間O(1)

109  ConvertSorted List to Binary Search Tree      30.8%      Medium

138  CopyList with Random Pointer      26.1%      Hard

141  LinkedList Cycle      36.6%      Easy

判斷指標是否有環

快慢指標,快指標的判斷要注意先判斷p->next再判斷p->next->next,不能直接判斷,否則有可能崩潰,時間O(n), 空間O(1)

142  LinkedList Cycle II   31.3%      Medium

找出環的入口

快慢指標,這個要畫圖,把環畫出來,給變數xy來推,最後能得到一個普遍性質的,開始點再走固定步長相交的點就是入口,好像???(當時推過,這個過程要重新推下)

時間O(n), 空間O(1),其實要走兩趟

143  ReorderList     23.1%      Medium

對連結串列重排列,例子:

Given a singly linked list LL0L1→…→Ln-1Ln,
reorderit to: 
L0LnL1Ln-1L2Ln-2→…

方法1:指標陣列,找下規則,重新放。時間O(n), 空間O(1)可以寫一遍方法。2:把連結串列分成兩段,後面一段反轉,再把兩條連結串列交叉拼接。這題感覺是206238的結合。時間O(n), 空間O(1)

147  InsertionSort List    29.8%      Medium

148  SortList   25.3%      Medium

排序

方法1,指標陣列+快排。時間O(nlogn),空間O(n)  很慢,要672ms

方法2:這個要寫一遍!!!!!

160  Intersectionof Two Linked Lists      30.4%      Easy

想不起來的,還要仔細想想

203  RemoveLinked List Elements 29.1%      Easy

刪除連結串列中給定值的節點

Example

Given: 1 --> 2 --> 6 --> 3 --> 4 --> 5--> 6, val = 6

Return: 1 --> 2 --> 3 --> 4 --> 5

這裡有兩種特殊的情況,就是給定節點連續和這種節點是最後一位,兩種情況都應該考慮。解法(1)先造一個空的節點phphnext為頭結點,一直判斷當前節點的next是否是給定值得節點,則刪除。(2)另外一種做法思路同237,如果當前節點是給定值,就是把next節點的值賦給當前節點,刪除next,但是好像無法處理連續相同節點的情況??(可以處理,但是最後一個節點是給定節點這種情況無法處理)時間O(n), 空間O(1)

206  ReverseLinked List  40.2%      Easy

(典型的面試題)連結串列的反轉

head節點的next一直放到頭部,需要三個指標,畫圖,其他沒什麼要注意的了,時間O(n),空間O(1)

234  PalindromeLinked List    28.8%      Easy

判斷連結串列是否是迴文

因為是判斷性質,不需要改連結串列結構,用一個int陣列得到連結串列所有值,轉換為判斷陣列是否是迴文求解即可。優化:可以通過realloc函式動態動態擴充套件int陣列大小(一趟即可),不然的話要先走一遍鏈條得到連結串列長度,需要兩趟。時間O(n),空間O(n)

237  DeleteNode in a Linked List   44.0%      Easy

刪除連結串列當前節,例:1-2-3-4,給定3,最終得到1-2-4

void deleteNode(struct ListNode* node)

把當前節點的next節點的值賦給當前節點後,刪除next節點,時間O(1),空間O(1)

328  OddEven Linked List       38.8%      Medium

奇數節點和偶數節點都各自形成鏈,再拼接

Example:

Given 1->2->3->4->5->NULL,

return 1->3->5->2->4->NULL.

奇數節點和偶數節點都各自形成鏈,再拼接,要注意偶數連結串列最後一個節點的next要置為NULL,判斷奇偶用if(pos%2 == 0)  if(pos& 1) 都可以,前者好像還快一點,why??

時間O(n),空間O(n)