📣 独立日限时特惠: VIP通行证立减$68
查看: 10093| 回复: 15
跳转到指定楼层
上一主题 下一主题
收起左侧

[Leetcode] Intersection of Two Linked Lists分享一种和答案不同的简单解法

全局:

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

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

x
LeetCode今天更新了一道新题,难度Easy,我做完之后在上面分享了一种解法,很好理解,和答案的思路不同。

主要思路就是跳过较长的List前面的nodes,从长度相等的地方开始一个一个的比较,直到找到Intersection或者到末尾都没有Intersection。

  1.     public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
  2.         if (headA == null || headB == null) return null;
  3.         int lenA = length(headA);
  4.         int lenB = length(headB);
  5.         int diff = Math.abs(lenA - lenB);
  6.         while(diff > 0) {
  7.             if (lenA > lenB) headA = headA.next;
  8.             else headB = headB.next;
  9.             diff--;
  10.         }
  11.         while (headA != null && headB != null) {
  12.             if (headA.val == headB.val) return headA;
  13.             headA = headA.next;
  14.             headB = headB.next;
  15.         }
  16.         return null;
  17.     }

  18.     private int length(ListNode n) {
  19.         if (n == null) return 0;
  20.         int length = 0;
  21.         while (n != null) {
  22.             length++;
  23.             n = n.next;
  24.         }
  25.         return length;
  26.     }
复制代码

欢迎大家猛戳连接各种吐槽,点下左上角的Votes投个票也是可以的,感恩! -> http://t.cn/RztHGYJ

随时欢迎正在刷题和找工作同学的骚扰,讨论解题思路,面试经验,谈人生,谈理想~可以加微博:
http://www.weibo.com/freetymekiyan

祝大家感恩节快乐!





上一篇:read4 II 我的感想
下一篇:问一下CC150里面的DFS代码
推荐
Adeath 2014-11-28 02:11:54 | 只看该作者
全局:
  1. public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
  2.         if(headA==null || headB==null) return null;
  3.         int lenA = 1;
  4.         ListNode a = headA;
  5.         for(;a.next!=null;a=a.next) lenA++;
  6.         int lenB = 1;
  7.         ListNode b = headB;
  8.         for(;b.next!=null;b=b.next) lenB++; // calculate length of A and B
  9.         if (a!=b) return null;  // no intersection
  10.         int pad = Math.abs(lenA-lenB); // length we have to pad
  11.         a = lenA>lenB?headA:headB;  // a is longer list
  12.         b = a==headA?headB:headA;  // b is shorter list
  13.         for(;pad!=0;pad--) a=a.next; // now a b are in the
  14.         for(;a!=b;a=a.next) b=b.next; // same distance with intersection
  15.         return a;
  16.     }
复制代码
我也刚写完  一样的思路啊
回复

使用道具 举报

推荐
 楼主| Freetymekiyan 2014-11-28 07:51:20 | 只看该作者
全局:
本帖最后由 Freetymekiyan 于 2014-11-27 18:55 编辑
masa 发表于 2014-11-27 17:56
我以为跟C++和Python一样该戒掉这个坏习惯了
  1. public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
  2.     int lenA = length(headA), lenB = length(headB);
  3.     // move headA and headB to the same start point
  4.     while (lenA > lenB) {
  5.         headA = headA.next;
  6.         lenA--;
  7.     }
  8.     while (lenA < lenB) {
  9.         headB = headB.next;
  10.         lenB--;
  11.     }
  12.     // find the intersection until end
  13.     while (headA != headB) {
  14.         headA = headA.next;
  15.         headB = headB.next;
  16.     }
  17.     return headA;
  18. }
复制代码
这种写法更neat了
回复

使用道具 举报

推荐
stellari 2017-10-12 02:51:43 | 只看该作者
全局:
copper1820 发表于 2017-10-11 16:27
您好,我刚刚开始刷题 对这道题的题意理解不是很到位,想问下为什么一定要把较长的链表前面一部分跳过呢? ...

不能用node中的数据值是否相同来判断是否为同一个node,因为两个node中可能存有相同的数据值。只能用其地址是否相同来判断是否为同一node。况且,即使真的可以用数据值来判断,你也不能“直接找到5”,因为你一开始并不知两个链表相交处的值究竟是多少。
回复

使用道具 举报

🔗
masa 2014-11-28 05:29:17 | 只看该作者
全局:
本帖最后由 masa 于 2014-11-28 05:32 编辑
  1. if (lenA > lenB)
  2.    while (diff--)
  3.       A = A.next
  4. else
  5.    while (diff--)
  6.       B = B.next
复制代码
這樣不是更好嗎?不用每次都去check A和B誰長
回复

使用道具 举报

🔗
 楼主| Freetymekiyan 2014-11-28 06:49:08 | 只看该作者
全局:
masa 发表于 2014-11-27 16:29
這樣不是更好嗎?不用每次都去check A和B誰長

我一开始是这么写的,确实是不用每次判断
主要是觉得不想写两边while(diff--),这样更neat

另外受老师的影响也比较少用inline的--或++,不容易出错
回复

使用道具 举报

🔗
 楼主| Freetymekiyan 2014-11-28 06:52:03 | 只看该作者
全局:
masa 发表于 2014-11-27 16:29
這樣不是更好嗎?不用每次都去check A和B誰長

BTW, Java的while里面必须得是boolean
回复

使用道具 举报

🔗
masa 2014-11-28 06:54:39 | 只看该作者
全局:
Freetymekiyan 发表于 2014-11-28 06:49
我一开始是这么写的,确实是不用每次判断
主要是觉得不想写两边while(diff--),这样更neat

虽然是更neat但是没那么efficient吧。。

我本来是在while里面写的--diff的,后来觉得看起來太长就移到while去了……
回复

使用道具 举报

🔗
masa 2014-11-28 06:56:04 | 只看该作者
全局:
Freetymekiyan 发表于 2014-11-28 06:52
BTW, Java的while里面必须得是boolean

我以为跟C++和Python一样{:8_253:}该戒掉这个坏习惯了
回复

使用道具 举报

🔗
masa 2014-11-28 08:00:11 | 只看该作者
全局:
回复

使用道具 举报

🔗
tbu 2014-11-28 08:31:02 | 只看该作者
全局:
从代码neat的角度来讲的话,算完lenA和lenB之后可以直接写  if(lenB>lenA) return getIntersectionNode(headB, headA);

这样的好处是默认A总是比B长,根本不用再做多余的判断,坏处是如果B比A长那么相当于又要返回去再算一遍各自的长度,虽然还是linear但总归要慢点儿
回复

使用道具 举报

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

本版积分规则

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