
今天給大家分享一道位元組跳動的面試題,也就是 Leetcode 83. 删除排序連結清單中的重複元素,提供三種(遞歸、疊代(單指針、雙指針))解題思路,供大家參考。
題目
給定一個排序連結清單,删除所有重複的元素,使得每個元素隻出現一次。
示例 1:
輸入: 1->1->2
輸出: 1->2
示例 2:
輸入: 1->1->2->3->3
輸出: 1->2->3
遞歸解法
解題思路:在上上期的面試不可不會的單連結清單反轉中,提到了針對連結清單的題目可以采用遞歸的思想去解答,其主要的思想:把連結清單看成頭節點後面挂接一個更短的連結清單,這個更短的連結清單的頭節點是原連結清單的第二個節點,更短的這個連結清單又可以看成是目前連結清單的頭節點後面再挂接一個更更短的連結清單,這個更更短的連結清單的頭節點是原連結清單的第三個節點,依次類推。以連結清單1->2->3->4為例,具體如下圖示:
有了上面的分析,可以先删除更短的連結清單(或者更更短的連結清單)中的重複元素,然後再判斷頭節點的值是否跟删除後更短連結清單的頭節點值是否相等,相等則将頭節點也删除,否則把删除後更短連結清單挂接在頭節點的後面。以連結清單 1->1->2->3->3 為栗子,如下圖示:
Show me the Code
疊代單指針解法
解題思路:由于題目已說明連結清單是排序連結清單,是以隻需要周遊整個連結清單,然後挨個比較相鄰節點的值是否相等,相等則通過将目前節點指向其下下個節點的方式去删除其下一個節點(重複元素)。
疊代雙指針解法
解題思路:定義兩個指針,分别指向頭節點和頭節點的下一節點,移動這兩個指針去周遊整個連結清單;邊周遊邊比較兩個指針指向的節點的值是否相等,相等則将目前節點就指向其下下個節點(相當于删除其下一節點),然後繼續周遊,否則不處理,周遊直到周遊完整個連結清單。
以連結清單 1->2->3->3->4->NULL 為栗子,如下圖所示: