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,記錄新頭節點,p的next置空,快指標指向尾節點和原頭節點相連,其他沒什麼需要注意的了時間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.
需要兩個指標pre和p,p的處理同第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.
節點p的next節點值相同,刪除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.
設定兩個連結串列p1和p2,小於給定值的放p1,大於放p2,最後連在一起,這題和21題有點像。時間O(n), 空間O(1)
92 ReverseLinked List II 28.2% Medium
給定值m和n,將連結串列中第m和第n節點之間的所有節點順序進行反轉
Given 1->2->3->4->5->NULL, m = 2 and n = 4,
return 1->4->3->2->5->NULL.
有兩種方法:(1)找到n和m這兩個節點,反轉的方法參照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 L: L0→L1→…→Ln-1→Ln,
reorderit to: L0→Ln→L1→Ln-1→L2→Ln-2→…
方法1:指標陣列,找下規則,重新放。時間O(n), 空間O(1)。可以寫一遍方法。2:把連結串列分成兩段,後面一段反轉,再把兩條連結串列交叉拼接。這題感覺是206和238的結合。時間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)先造一個空的節點ph,ph的next為頭結點,一直判斷當前節點的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)