【LeetCode 簡單題】16-刪除排序連結串列中的重複元素
阿新 • • 發佈:2018-12-10
宣告:
今天是第16道題。給定一個排序連結串列,刪除所有重複的元素,使得每個元素只出現一次。以下所有程式碼經過樓主驗證都能在LeetCode上執行成功,程式碼也是借鑑別人的,在文末會附上參考的部落格連結,如果侵犯了博主的相關權益,請聯絡我刪除
(手動比心ღ( ´・ᴗ・` ))
正文
題目:給定一個排序連結串列,刪除所有重複的元素,使得每個元素只出現一次。
示例 1:
輸入: 1->1->2 輸出: 1->2
示例 2:
輸入: 1->1->2->3->3 輸出: 1->2->3
解法1。直接對給的連結串列進行操作,比較前後兩個元素的值是否相等,相等則替換掉,不相等則前後兩個指標(不是指C++裡那種指標,只是兩個記錄當前遍歷元素的變數)繼續移動,程式碼如下。不過這裡我有個問題,就是連結串列的值很容易被修改,只要賦值給兩個指標,這兩個指標就容易修改原連結串列,就像這道題裡體現的,是這樣嗎?
# Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: def deleteDuplicates(self, head): """ :type head: ListNode :rtype: ListNode """ # V 1.0,能提交 if not head: # 注意這裡一定要驗證head是否為空,否則後面提交測試會出問題 return head pin_1 = head # 初始化,用pin_1和pin_2記錄當前元素和下一元素 pin_2 = head.next while pin_2 != None: if pin_1.val == pin_2.val: # 如果相等,則將pin_1指向的元素踢掉,pin_1指向pin_2指向的元素,pin_2指向下一個元素 pin_1.next = pin_2.next pin_2 = pin_2.next else: # 如果不相等,兩指標移動1位 pin_1 = pin_2 pin_2 = pin_2.next return head # 返回head,head已經被修改
解法2。這種解法其實和上一種解法一樣,只是減少了1個指標,節省空間。
class Solution: def deleteDuplicates(self, head): # V 2.0,能提交 if head is None: return head pin = head while pin.next: if pin.val == pin.next.val: pin.next = pin.next.next # 注意這個是賦值=,而不是判斷相等== else: pin = pin.next return head