题目描述(简单难度)

83. Remove Duplicates from Sorted List - 图1

给定一个链表,去重,每个数字只保留一个。

解法一 修改

按偷懒的方法,直接在 82 题的基础上改,如果没做过可以先去看一下。之前是重复的数字一个都不保留,这道题的话要留一个,所以代码也很好改。

1. 迭代法

  1. public ListNode deleteDuplicates(ListNode head) {
  2. ListNode pre = new ListNode(0);
  3. ListNode dummy = pre;
  4. pre.next = head;
  5. ListNode cur = head;
  6. while(cur!=null && cur.next!=null){
  7. boolean equal = false;
  8. while(cur.next!=null && cur.val == cur.next.val){
  9. cur = cur.next;
  10. equal = true;
  11. }
  12. if(equal){
  13. /*************修改的地方*****************/
  14. //pre.next 指向 cur,不再跳过当前数字
  15. pre.next = cur;
  16. pre = cur;
  17. /**************************************/
  18. equal = false;
  19. }else{
  20. pre = cur;
  21. }
  22. cur = cur.next;
  23. }
  24. return dummy.next;
  25. }

2. 递归

  1. public ListNode deleteDuplicates(ListNode head) {
  2. if (head == null) return null;
  3. //如果头结点和后边的节点相等
  4. if (head.next != null && head.val == head.next.val) {
  5. //跳过所有重复数字
  6. while (head.next != null && head.val == head.next.val) {
  7. head = head.next;
  8. }
  9. /*************修改的地方*****************/
  10. //将 head 也包含,进入递归
  11. return deleteDuplicates(head);
  12. /**************************************/
  13. //头结点和后边的节点不相等
  14. } else {
  15. //保留头结点,后边的所有节点进入递归
  16. head.next = deleteDuplicates(head.next);
  17. }
  18. //返回头结点
  19. return head;
  20. }

解法二 迭代

82 题由于我们要把所有重复的数字都要删除,所有要有一个 pre 指针,指向所有重复数字的最前边。而这道题,我们最终要保留一个数字,所以完全不需要 pre 指针。还有就是,我们不用一次性找到所有重复的数字,我们只需要找到一个,删除一个就够了。所以代码看起来更加简单了。

  1. public ListNode deleteDuplicates(ListNode head) {
  2. ListNode cur = head;
  3. while(cur!=null && cur.next!=null){
  4. //相等的话就删除下一个节点
  5. if(cur.val == cur.next.val){
  6. cur.next = cur.next.next;
  7. //不相等就后移
  8. }else{
  9. cur = cur.next;
  10. }
  11. }
  12. return head;
  13. }

时间复杂度:O(n)。

空间复杂度:O(1)。

解法三 递归

同样的,递归也会更简单些。

  1. public ListNode deleteDuplicates(ListNode head) {
  2. if(head == null || head.next == null){
  3. return head;
  4. }
  5. //头结点和后一个时候相等
  6. if(head.val == head.next.val){
  7. //去掉头结点
  8. return deleteDuplicates(head.next);
  9. }else{
  10. //加上头结点
  11. head.next = deleteDuplicates(head.next);
  12. return head;
  13. }
  14. }

如果 82 题会做的话,这道题就水到渠成了。

windliang wechat

添加好友一起进步~

如果觉得有帮助的话,可以点击 这里 给一个 star 哦 ^^

如果想系统的学习数据结构和算法,强烈推荐一个我之前学过的课程,可以点击 这里 查看详情