📅  最后修改于: 2023-12-03 15:21:57.890000             🧑  作者: Mango
删除链表中出现的重复项,要求保留链表中没有重复的元素,链表中的所有元素都是按照升序排列的。
输入: 1->2->3->3->4->4->5 输出: 1->2->5
输入: 1->1->1->2->3 输出: 2->3
此题需要遍历链表,判断当前节点与它后面的节点是否重复,或者当前节点与它前面的节点是否重复。如果重复,需要删除当前节点并将前一个节点与后一个节点相连。我们可以通过两个指针的方法来判断重复,分别为 prev
和 cur
指针。初始时,prev
指向头结点,cur
指向头结点的下一个节点。如果 prev
和 cur
节点的值相同,则将 cur
后移,继续判断。如果不相同,则 prev
移动到 cur
所在位置,cur
向后移动一个位置。这样,当 cur
遍历到链表末尾时,重复元素已经被删除,链表也被整理完毕。
class Solution:
def deleteDuplicates(self, head: ListNode) -> ListNode:
if not head:
return None
dummy = ListNode(0)
dummy.next = head
prev = dummy
cur = head
while cur:
while cur.next and cur.val == cur.next.val:
cur = cur.next
if prev.next == cur:
prev = prev.next
else:
prev.next = cur.next
cur = cur.next
return dummy.next
class Solution {
public ListNode deleteDuplicates(ListNode head) {
if (head == null) {
return null;
}
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode prev = dummy;
ListNode cur = head;
while (cur != null) {
while (cur.next != null && cur.val == cur.next.val) {
cur = cur.next;
}
if (prev.next == cur) {
prev = prev.next;
} else {
prev.next = cur.next;
}
cur = cur.next;
}
return dummy.next;
}
}
由于每个节点都只会被遍历一次,因此时间复杂度为:$O(n)$。
由于只需要维护两个指针,空间复杂度为:$O(1)$。