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