Open songyy5517 opened 6 months ago
思路:双指针
复杂度分析
import java.util.*;
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public ListNode deleteDuplication(ListNode pHead) {
// 思路:双指针。
// 1. 异常处理
if (pHead == null)
return null;
// 2. 定义双指针
ListNode p1 = pHead; // 检验重复节点
ListNode head_ = new ListNode(0); // 伪头节点
head_.next = p1;
ListNode p2 = head_; // 指向最后一个不重复节点
while (p1 != null){
// 出现重复节点
if (p1.next != null && p1.val == p1.next.val){
while (p1.next != null && p1.val == p1.next.val)
p1 = p1.next;
// 删除重复节点
p2.next = p1.next;
}
// 没遇到重复节点,指针继续向后移动
else
p2 = p1;
p1 = p1.next;
}
return head_.next;
}
}
2024/5/3
描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表 1->2->3->3->4->4->5 处理后为 1->2->5。 例如输入{1,2,3,3,4,4,5}时,对应的输出为{1,2,5},对应的输入输出链表如下图所示:
示例1
示例2
分析 这道题本质上是考察对链表的操作。题中的关键信息是链表中节点是排序的,因此重复的节点必然都挨在一起。从而整个问题可大致分为两部分:1. 识别重复节点(遍历链表,比较当前节点跟下一个节点); 2. 删除重复节点(双指针)。