【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

结尾

解法1:https://blog.csdn.net/sinat_23133783/article/details/79114381

解法2:https://blog.csdn.net/IT_job/article/details/80214515

猜你喜欢

转载自blog.csdn.net/weixin_41011942/article/details/82721185