1. 程式人生 > >【LeetCode 簡單題】16-刪除排序連結串列中的重複元素

【LeetCode 簡單題】16-刪除排序連結串列中的重複元素

宣告:

今天是第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

結尾