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

题目说明

给定一个排序链表(已经按顺序排序好的链表),删除所有重复的元素,使得每个元素只出现一次。

示例

例1

1
2
输入: 1->1->2
输出: 1->2

例2

1
2
输入: 1->1->2->3->3
输出: 1->2->3

笔者理解

此题是一道排序链表算法问题,在力扣题库中被定义为简单题。

解法

此题中的链表为排序链表,要求为去除重复节点,所以不需要多余思考,直接依链判断即可,就让我们看看具体如何实现吧。

1->1->2->3->3
↑temp所在位置

因为1==1,所以链表的第一个1的next要指向第二节点的下一个节点2;
链表变为:1->2->3->3

因为1!=2,所以链表从下一个2开始判断,也就是中间值temp移向下一个节点2;
链表变为:1->2->3->3

因为2!=3,所以链表从下一个3开始判断,也就是中间值temp移向下一个节点3;
链表变为:1->2->3->3

因为3==3,所以链表的第一个3的next要指向最后一个节点的下一个节点,也就是null;
链表变为:1->2->3->

此时temp的下一个节点等于null,结束循环

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode deleteDuplicates(ListNode head) {
ListNode temp = head;
//定义一个中间值来间接操作链表head
while(temp!=null&&temp.next!=null){
//当当前节点为空或者当前节点的后继节点为空时结束循环
if(temp.val==temp.next.val){
//如果当前节点的值和后继节点的值相同,当前节点的后继指向后移
temp.next = temp.next.next;
}
else{
//如果当前节点的值和后继节点的值不相同,temp后移一位,继续判断下一个节点
temp = temp.next;
}
}
return head;
//返回操作好的链表
}
}

时间和空间效率都较高,可见此解法比较适合此题;

image.png

总结

本题是一道有意思的简单题,感兴趣的朋友都可以去尝试一下,此题还有其他更多的解法,朋友们可以自己逐一尝试。