天机阁

83. 删除排序链表中的重复元素

2022-07-05 · 2 min read
LeetCode

题目

给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表。

难度:🌟

示例 1:

输入:head = [1,1,2]
输出:[1,2]

示例 2:

输入:head = [1,1,2,3,3]
输出:[1,2,3]
 

提示:

链表中节点数目在范围 [0, 300] 内
-100 <= Node.val <= 100
题目数据保证链表已经按升序 排列

题解

思路一:
遍历链表,如果链表元素和前一个相同,则删除当前节点,直到遍历结束

思路二:
使用快慢指针,当快指针和慢指针指向元素不同时,删除快慢指针中间的元素。

代码实现

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func deleteDuplicates(head *ListNode) *ListNode {
	if head == nil || head.Next == nil {
		return head
	}
	dummy := &ListNode{Val: -1}
	dummy.Next = head
	curr := head
	for head.Next != nil { // 遍历链表
		next := head.Next
		if curr.Val == next.Val {
			second := next.Next
			curr.Next = second // 删除 next 节点
		} else {
			curr = next
		}
		head = curr
	}
	return dummy.Next
}