leetcode的python实现-面试题 02.01. 移除重复节点

leetcode-面试题 02.01. 移除重复节点

题目描述
编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。
示例1:
输入:[1, 2, 3, 3, 2, 1]
输出:[1, 2, 3]

示例2:
输入:[1, 1, 1, 1, 2]
输出:[1, 2]

提示:
链表长度在[0, 20000]范围内。
链表元素在[0, 20000]范围内。

进阶:
如果不得使用临时缓冲区,该怎么解决?
官网题目链接:https://leetcode-cn.com/problems/remove-duplicate-node-lcci/

思路:
1.哈希表.使用缓存,初始化一个哈希集合check,用来记录已经出现的链表节点值,下一次再出现该值,则应该跳过该节点.时间复杂度O(n),空间复杂度为O(n).

2.两次遍历.不使用额外的缓存区,对链表遍历两遍,设置两个指针p1,p2,其中p1指针为外循环,p2为内循环,时间复杂度为O(n^2),空间复杂度为O(1).
方法2虽然正确,但是时间复杂度较高,在官网运行会提示超时.​

python3实现:
1.哈希表

# Definition for singly-linked list.
class ListNode:
    def __init__(self, x, next=None):
        self.val = x
        self.next = next

class Solution:
    def removeDuplicateNodes(self, head: ListNode) -> ListNode:
        if not head:
            return head
        cur = head
        check = set()
        check.add(head.val)
        while cur.next:
            if cur.next.val  not in check:
                check.add(cur.next.val)
                cur = cur.next
            else:
                cur.next = cur.next.next
        return head

2.两次遍历

class Solution:
    def removeDuplicateNodes(self, head: ListNode) -> ListNode:
        if not head:
            return head
        p1 = head
        while p1:
            p2 = p1
            while p2.next:
                if p2.next.val != p1.val:
                    p2 = p2.next
                else:
                    p2.next = p2.next.next
            p1 = p1.next
        return head

欢迎关注公众号-算法学习总结,获取更多题解,欢迎共同交流学习
leetcode的python实现-面试题 02.01. 移除重复节点_第1张图片

你可能感兴趣的:(leetcode,python,链表,算法,数据结构,leetcode,python)