- 题目描述
给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
- 示例
示例 1:
输入: 1->1->2
输出: 1->2
示例 2:
输入: 1->1->2->3->3
输出: 1->2->3
- 解决思路一
自己想到的,最笨的方法,用List存所有的数,去重之后再把List中的数字放到新的链表中,返回新链表。
实质上并没有用到链表的结构,所以有点弱智。。。不过好在自己能写题了,还是开心,独立完成的第一道题!
- 代码一
# 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
"""
#用列表来存放链表中所有的数字
a = []
while head:
t = head.val
a.append(t)
head = head.next
#对列表进行去重
b =[]
for x in a:
if x not in b:
b.append(x)
#定义新的链表来存放去重后的列表
s = ListNode(0)
m = s
#存放列表中的数字
for i in b:
s.next = ListNode(i)
s = s.next
return m.next
- 解决思路二
网上的方法,其实一开始我也想着要这样做,不过脑子转不过弯来,想不出来如果当前节点和下个节点相同的话,怎么把当前节点指向下下个节点,看到了其他大神们的代码才知道可以借用第三个变量来暂存下下个节点,然后把当前节点指向第三个变量。
另外是需要特别注意判断是否为空,不论是在一开始判断输入的head,还是之后判断当前节点和下一个节点的值是否相同,以及在当前节点指向下下个节点之前,都需要判断要访问到的节点不是None,才能进行相应的操作。
- 代码二
# 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 """ #一定要判断,因为如果链表为空的话,头节点也是NULL,返回会出错 if head is None: return None r = head #保证当前节点的下一个节点不是空的 while r.next: #如果当前节点和第一个节点的值相同,那么就要要把当前节点指向下下一个节点 if r.next.val == r.val: #在此之前先确定下下一个节点不是None if r.next.next != None: #将当前节点指向下下一个节点的方法,借助第三方力量 temp = r.next.next r.next = temp #如果下下个节点是None的话,那么直接把当前节点指向空节点 else: r.next = None else: r = r.next return head