给定一个已排序的链表的头
head
, 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。示例 1:
输入:head = [1,1,2] 输出:[1,2]示例 2:
输入:head = [1,1,2,3,3] 输出:[1,2,3]提示:
- 链表中节点数目在范围
[0, 300]
内-100 <= Node.val <= 100
- 题目数据保证链表已经按升序 排列
线性法
10min
常规
public ListNode deleteDuplicates(ListNode head) {
if (head == null || head.next == null) return head;
ListNode cur = head;
while(cur.next != null){
if(cur.val != cur.next.val){
cur = cur.next;
}else{
cur.next = cur.next.next;
}
}
return head;
}
快慢双指针
20min
区分 链表.next = 链表 和 链表 = 链表.next 第一种方法会改变链表结构 第二种方法则不会 只是移动到下一个节点 slow只改变链表 fast探路。
只要fast找到和当前相同的节点值则继续迭代,如果不同则连接到链表
public ListNode deleteDuplicates(ListNode head) {
//1.剪枝 2.定义快慢指针 快指针先行探路 慢指针维护吴重复节点
if(head == null || head.next == null) return head;
ListNode slow = head;
ListNode fast = head.next;
//这里一定要当前!=null 用fast.next会无法遍历到最后一个节点
while(fast != null){
//如果fast发现了与当前slow的值不一样的节点就跟自己连接,说白了slow所有的元素都是不重复的,fast只是探路的
if(slow.val != fast.val){
slow.next = fast;
slow = slow.next;
}else{
fast = fast.next;
}
}
//在遍历结束后,slow 指针可能仍然指向最后一个唯一的节点,但它的 next 可能依然指向一个重复节点(如果链表以重复节点结束)。
slow.next = null;
return head;
}
标签:head,slow,cur,fast,next,链表,83,指针
From: https://blog.csdn.net/m0_63920681/article/details/143058541