1. Exigir
- Dada uma lista vinculada classificada, exclua todos os nós com números repetidos e mantenha apenas os números que não aparecem repetidamente na lista vinculada original .
Exemplo 1:
Entrada: 1-> 2-> 3-> 3-> 4-> 4-> 5 Saída: 1-> 2-> 5
Exemplo 2:
Entrada: 1-> 1-> 1-> 2-> 3 Saída: 2-> 3
Dois, método recursivo
2.1 Análise de pensamento
- Existem duas tarefas a serem concluídas pelo método recursivo: ①Para elementos repetidos, deve ser pulado diretamente; ②Para elementos não repetitivos, estabelecer conexões;
- É importante notar que por que esse problema pode ser resolvido por recursão? Primeiro, olhe para a função deste método é retornar uma lista vinculada ascendente sem elementos duplicados, ou seja, podemos localizar o primeiro elemento não duplicado na lista vinculada original, e seu próximo pode ser implementado por este método, e assim por diante, o problema original pode ser resolvido Decompor em vários subproblemas;
2.2 Implementação do código
class Solution {
public ListNode deleteDuplicates(ListNode head) {
if(head == null || head.next == null) {
return head;
}
ListNode nextNode = head.next;
if(nextNode.val == head.val) {
//定位到链表的不重复节点
while(nextNode != null && nextNode.val == head.val) {
nextNode = nextNode.next;
}
//舍弃重复节点部分
head = deleteDuplicates(nextNode);
} else {
//连接无重复的节点
head.next = deleteDuplicates(head.next);
}
return head;
}
}
2.3 Análise de complexidade
- A complexidade do tempo é O (N), e todos os nós da lista vinculada precisam ser percorridos;
- A complexidade do espaço é O (N), e a profundidade de recursão pode chegar até N;