一、题目
1、算法题目
“给定一个升序的链表,删除链表中重复的节点,返回升序排列的结果链表。”
题目链接:
来源:力扣(LeetCode)
链接:82. 删除排序链表中的重复元素 II - 力扣(LeetCode) (leetcode-cn.com)
2、题目描述
存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。
返回同样按升序排列的结果链表。
网络异常,图片无法展示
|
示例 1: 输入: head = [1,2,3,3,4,4,5] 输出: [1,2,5] 复制代码
示例 2: 输入: head = [1,1,1,2,3] 输出: [2,3] 复制代码
二、解题
1、思路分析
利用有序链表的特点,重复节点出现的位置一定也是连续的。
那么就可以一次循环,删除重复的节点,由于头节点可能被删除,所以需要先保存头节点。
从头节点开始判断:
- cur.val == cur.next.val,记录出现重复的节点,往后移动,直到不再相同或为空节点结束,将记录的节点删除
- cur.val != cur.next.val,说明对应元素不相同,将cur指向cur.next
2、代码实现
代码参考:
class Solution { public ListNode deleteDuplicates(ListNode head) { if (head == null) { return head; } ListNode dummy = new ListNode(0, head); ListNode cur = dummy; while (cur.next != null && cur.next.next != null) { if (cur.next.val == cur.next.next.val) { int x = cur.next.val; while (cur.next != null && cur.next.val == x) { cur.next = cur.next.next; } } else { cur = cur.next; } } return dummy.next; } } 复制代码
网络异常,图片无法展示
|
3、时间复杂度
时间复杂度 : O(n)
其中n是数组的长度
空间复杂度: O(1)
只需要常量级的变量空间即可。
三、总结
对于链表或者树的问题,一般可以使用递归或迭代两种写法,本题就使用了递归。
递归的题目,最重要的是要清楚递归函数的定义和递归终止条件。
这道题的递归定义就是删除以头节点开头的链表中重复的节点。
那么递归终止条件就是如果cur为空,那么肯定没有重复的节点,直接返回cur。
如果cur.next为空,那么说明链表中只有一个节点,也没有出现重复的节点,直接返回cur。