【刷题笔记】83. 删除排序链表中的重复元素

60 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第6天,点击查看活动详情

一、题目描述:

83. 删除排序链表中的重复元素 - 力扣(LeetCode)

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

示例 1:

image.png

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

示例 2:

image.png

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

提示:

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

二、思路分析:

通过快慢指针求解,要注意的是链表中必须有两个或两个以上的值才能进行操作,若头指针为空和仅一个数则直接返回头指针,若不是则用双指针,一个指针等于头指针作为慢指针,再将另一个指针指向头指针的下一个数据作为快指针,进行循环若快指针指向空则结束(快指针指针域为空时最后一个数据并为进行判断,所以循环结束后还要加一个对最后一个数据的判断),循环中判断快指针数据域数值是否与慢指针数据域数值相同,若不相同则慢指针指针域指向快指针所在位置,再慢指针等于快指针,从而达到将不同数据排列的目的,最后再将慢指针指针域置空。

三、AC 代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* deleteDuplicates(struct ListNode* head){
    struct ListNode *s,*r;
    if(head==NULL||head->next==NULL)
    return head;
    else {
    r=head->next;
    s=head;
    while (r->next!=NULL){
        if(s->val!=r->val) {
            s->next=r;
            s=r;
        }
        r=r->next;
    } 
     if(s->val!=r->val){ 
       s->next=r;
       s=r;}
       s->next=NULL;
    return head;}
}

范文参考:

【迭代】动图示解:83. 删除排序链表中的重复元素 - 删除排序链表中的重复元素 - 力扣(LeetCode)