查看: 1182| 回复: 7
跳转到指定楼层
上一主题 下一主题
收起左侧

[树/链表/图] 加米, lc82的细节讨论 Remove Duplicates from Sorted List II

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
麻烦帮我看一下这个题,会尽力为大家加米,谢谢。
-----------------------题目描述-------------------------------------------------
Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.

Example 1:

Input: 1->2->3->3->4->4->5
Output: 1->2->5
Example 2:



我的疑问是:

我用下面代码的逻辑在python3里写了一遍,运行出来的结果是[1,2,3,5];我认为在第20行slow.next = fast.next;, slow已经指向了3,所以3被保留在了结果中。感觉这个逻辑是不对的,为什么Java的结果通过了呢?
-------------------accepted Java代码----------------------------------
  1. /**
  2. * Definition for singly-linked list.
  3. * public class ListNode {
  4. *     int val;
  5. *     ListNode next;
  6. *     ListNode(int x) { val = x; }
  7. * }
  8. */
  9. public class Solution {
  10.     public ListNode deleteDuplicates(ListNode head) {
  11.         //use two pointers, slow - track the node before the dup nodes,
  12.         // fast - to find the last node of dups.
  13.         ListNode dummy = new ListNode(0), fast = head, slow = dummy;
  14.         slow.next = fast;
  15.         while(fast != null) {
  16.             while (fast.next != null && fast.val == fast.next.val) {
  17.                 fast = fast.next;    //while loop to find the last node of the dups.
  18.             }
  19.             if (slow.next != fast) { //duplicates detected.
  20.                 slow.next = fast.next; //remove the dups.
  21.                 fast = slow.next;     //reposition the fast pointer.
  22.             } else { //no dup, move down both pointer.
  23.                 slow = slow.next;
  24.                 fast = fast.next;
  25.             }

  26.         }
  27.         return dummy.next;
  28.     }
  29. }
复制代码



------wrong answer python 3 code--------------
  1. # Definition for singly-linked list.
  2. # class ListNode:
  3. #     def __init__(self, x):
  4. #         self.val = x
  5. #         self.next = None

  6. class Solution:
  7.     def deleteDuplicates(self, head: ListNode) -> ListNode:
  8.         dummy = ListNode(0);
  9.         slow = dummy;
  10.         fast = head;
  11.         slow.next = fast;
  12.         while (fast):
  13.             while (fast.next and fast.val == fast.next.val) :
  14.                 fast = fast.next;
  15.             
  16.             if (slow.next.val != fast.val):
  17.                 slow.next = fast.next;
  18.                 fast = slow.next;
  19.             else:
  20.                 slow = slow.next;
  21.                 fast = fast.next;
  22.         return dummy.next;
复制代码

上一篇:刷题分享帖之 291
下一篇:各位chaser,如何找到好的实习....
全局:
上面判断的是slow.next是不是fast,但是下面判断的是slow. next. val是不是fast. val,仔细想想,其实两者有区别。打个比方,如果1-2-3-3-4-4-5的时候,当slow在2那里,fast会停在第二个3,但是这个时候slow. next. val和fast. val是相等的,slow移向下一个3。这个时候,3就在你的返回值里面了。手机码字,不知道是不是清楚。

评分

参与人数 1大米 +2 收起 理由
超人96825 + 2 给你点个赞!

查看全部评分

回复

使用道具 举报

全局:
我实话我感觉这样的题面试不太可能会考 我自己suppose的
回复

使用道具 举报

🔗
 楼主| 超人96825 2019-12-27 11:34:10 | 只看该作者
全局:
plugin1689 发表于 2019-12-27 11:13
我实话我感觉这样的题面试不太可能会考 我自己suppose的

为什么呢?太简单了吗还是考察的点太直接?
回复

使用道具 举报

🔗
WarriorZ 2019-12-27 12:15:36 | 只看该作者
全局:
Java的代码没问题,fast指针始终在slow前一位,slow=2的时候fast=3,所以就把3的dupremove掉了。你Python的代码和Java逻辑不是完全一样的,在Pyhton17行if (slow.next.val != fast.val),直接比较值的话,slow=2,fast=3,那么这里slow.next 就等于第二个3了。后面这个3就到答案里面去了。Java20行比的是地址,即使是两个3也是不相等的。

评分

参与人数 1大米 +2 收起 理由
超人96825 + 2 谢谢,说的非常清楚~

查看全部评分

回复

使用道具 举报

🔗
 楼主| 超人96825 2019-12-27 12:23:48 | 只看该作者
全局:
不知道小帅 发表于 2019-12-27 11:56
上面判断的是slow.next是不是fast,但是下面判断的是slow. next. val是不是fast. val,仔细想想,其实两者 ...

谢谢,第一句话就点明了关键,说的很清楚。我现在明白啦! 应该是我对linked list的理解不到位,总是忽略listnode的链接特性,老想着node的具体value。

还有一个问题想请教,下面这种解法里pre.next = None;是自己怎么也想不到的,对linkedlist指来指去,什么留在要返回的链表里总是想不清楚。有没有什么建议呢?谢谢。
  1.     def deleteDuplicates(self, head):
  2.         dummy = ListNode(0);
  3.         pre = dummy;
  4.         cur = head;
  5.         real = dummy;

  6.         while (cur):
  7.             if (pre == dummy or pre.val != cur.val) and (cur.next == None or cur.val != cur.next.val ):
  8.                 real.next = cur;
  9.                 real = cur;
  10.                 pre = cur;
  11.                 cur = cur.next;
  12.                 pre.next = None;

  13.             else :
  14.                 pre = cur;
  15.                 cur = cur.next;
  16.                 pre.next = None;
  17.         return dummy.next;
复制代码
回复

使用道具 举报

🔗
 楼主| 超人96825 2019-12-27 12:25:57 | 只看该作者
全局:
WarriorZ 发表于 2019-12-27 12:15
Java的代码没问题,fast指针始终在slow前一位,slow=2的时候fast=3,所以就把3的dupre ...
谢谢,说的非常清楚~
回复

使用道具 举报

全局:
超人96825 发表于 2019/12/27 12:23:48
谢谢,第一句话就点明了关键,说的很清楚。我现在明白啦! 应该是我对linked list的理解不到位,总是忽略listn...
我觉得就自己拿纸多画一下吧。Linked list有时候还是很tricky的。自己画一下,考虑一下有没有corner case。
回复

使用道具 举报

全局:
超人96825 发表于 2019/12/27 12:23:48
谢谢,第一句话就点明了关键,说的很清楚。我现在明白啦! 应该是我对linked list的理解不到位,总是忽略listn...
还有就是用多个指针的话,一定要搞清楚指针的意义,哪个是返回值,快慢指针意义是什么。然后这个题目是有一些invariant的,不论何时都成立的。要保证每一步都是成立的。

评分

参与人数 1大米 +2 收起 理由
超人96825 + 2 好的,谢谢

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表