本题来源---《删除链表中重复元素》。
题目描述
给定一个已排序的链表的头 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.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* deleteDuplicates(struct ListNode* head)
{
}
关于本题,我整理了两种解题方法:
第一种:单指针
第二种:双指针
第一种:单指针
解题思路:
(1)声明一个指针指向头结点,比较cur指向的data域与cur->next指向的data域是否相等。
(2)如果相等,则删除该结点。
(3)如果不相等,移动cur指针,继续比较。
代码如下:
struct ListNode* deleteDuplicates(struct ListNode* head)
{
struct ListNode *cur,*tmp;
cur = head;
if( !head )
{
return NULL;
}
while( cur->next )
{
if( cur->val == cur->next->val )
{
tmp = cur->next;
cur->next = cur->next->next;
free(tmp);
}
else
{
cur = cur->next;
}
}
return head;
}
复杂度分析
时间复杂度:O(n)
空间复杂度:O(1)
第二种:双指针
解题思路:
(1)声明两个指针,第一个指针cur指向head,第二个指针ptr指向head->next。比较cur指向的data域与ptr指向的data域是否相等。
(2)如果相等,则删除该结点。
(3)如果不相等,移动cur、ptr指针,继续比较。
代码如下:
struct ListNode* deleteDuplicates(struct ListNode* head)
{
struct ListNode *cur,*ptr,*tmp;
if( !head )
{
return NULL;
}
cur = head;
ptr = head->next;
while( ptr )
{
if( cur->val != ptr->val )
{
cur = cur->next;
ptr = ptr->next;
}
else
{
tmp = ptr;
cur->next = ptr->next;
ptr = ptr->next;
free(tmp);
}
}
return head;
}
复杂度分析
时间复杂度:O(n)
空间复杂度:O(1)