leetcode第八十三题——删除链表重复元素

从今天开始,先更新leetcode上与链表有关的题,从简入繁吧。
这一题是一道简单类别的题目,多采用几种方法,主要是加强对于链表的理解。

1.题目

原题:

给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。

例子:

输入: 1->1->2->3->3
输出: 1->2->3

2.解析

这个题解法比较多,审题的关键在于这是一个排序的链表,因此不用考虑用一个额外的数组储存链表中已经出现元素的值。分三个思路来说吧。
(1)链表直接操作,定义一个当前链表和一个next链表,每次计算二者值是否相同,如果相同可以直接赋予next值,如果不同则要跳过,最后为了避免链表结尾出现重复元素,需要再while循环后加一个cur.next=None,表示链表的结束。
(2)也是链表直接操作,只不过这个不用定义pre链表,直接用next操作,原理上更好理解,实现起来也方便。
(3)这种解法是新定义一个链表,再插入数据。这个就是新建一个head为0的空链表,然后不断插入数据,不同实现方式大同小异。唯独注意一点,head和head.next两个同时成立的时候,会忽略掉最后一个变量,需要特殊处理一下,就是将while中的head.next加入到if中。

3.python代码

#解法1
class Solution:
    def deleteDuplicates(self, head):
        if not head:
            return None
        p = head
        pre = p
        cur = p.next
        while cur:
            if cur.val == pre.val:
                cur = cur.next
            else:
                pre.next = cur
                cur = cur.next
                pre = pre.next
        return head
#解法2
class solution:
    def deleteDuplicates(self, head):
        if not head:
            return None
        p = head
        cur = p
        while cur and cur.next:
            if cur.val == cur.next.val:
                cur.next = cur.next.next
            else:
                cur = cur.next
        return head
#解法3
class solution:
    def deleteDuplicates(self, head):
        if not head:
            return None
        new = ListNode(0)
        tmp = new
        while head:
            if head.next and head.val == head.next.val:
                head = head.next
            else:
                tmp.next = ListNode(head.val)
                tmp = tmp.next
                head = head.next
        return new.next

你可能感兴趣的:(leetcode第八十三题——删除链表重复元素)