给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
示例 1:
输入: 1->1->2
输出: 1->2
示例 2:输入: 1->1->2->3->3
输出: 1->2->3链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list
思路:
1.定义指针first指向head,second指向head->next
2.若first指向的值 等于 second指向的值,则second后移
3.若first指向的值 不等于 second指向的值,则first先后移,然后将second的值赋给first,最后second后移
4.当second最终指向NULL时,退出循环。为了截断后面无效的链表,first->next 指向NULL
5.返回head
时间复杂度:O(n)
空间复杂度:O(1)
ListNode* deleteDuplicates(ListNode* head) {
if (head == NULL)
return head;
ListNode* first = head;
ListNode* second = head->next;
while (second != NULL)
{
if (first->val == second->val)
second = second->next;
else {
first = first->next;
first->val = second->val;
second = second->next;
}
}
first->next = NULL;
return head;
}
Go方法:
该题思路类似于:力扣,只需注意最后要切断left指针后续的重复元素节点即可:left.Next = nil
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func deleteDuplicates(head *ListNode) *ListNode {
if head == nil {
return nil
}
var left, right *ListNode = head, head
for right != nil {
if left.Val != right.Val {
left.Next = right
left = left.Next
right = right.Next
} else {
right = right.Next
}
}
left.Next = nil
return head
}