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
欢迎关注公众号-算法学习总结,获取更多题解,欢迎共同交流学习