一段感动程序员的代码

本文写作想法来源于leetcode里面的解题,建议别轻易去做这题,会被感动哭的
剑指 Offer 52. 两个链表的第一个公共节点 图解 双指针法,浪漫相遇
在这里插入图片描述
这题第一个想法是两条链表的交集尾巴长度是一样,所以沃第一个想到的解法是
1、获取两条链表的长度
2、长度更大的链表头指针向前移动,直到两条链表长度相等
3、因为现在从头部指针开始两条链表长度相等了,所以逐一比较即可。
总觉得有更加巧妙的解法,所以看了一下评论,被评论区里的浪漫解法感动了。
解法如下:
设交集部分链长为c,链表1除开交集部分外的长度为a,链表2除开交集部分外的长度为b。
那么会有(a+c)+b = (b+c)+a
所以用两个指针遍历
指针1遍历路径是 链表1–>链表2
指针2遍历路径是 链表2–>链表1
因为(a+c)+b = (b+c)+a 所以两个指针会在交集的地方相遇
代码如下

public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        ListNode h1 = headA, h2 = headB;
        while (h1 != h2) {
            h1 = h1 == null ? headB : h1.next;
            h2 = h2 == null ? headA : h2.next;
        }
        return h1;  
    }

不仅仅会被这简洁的代码,巧妙的解法所感动,还会被解法里边的哲学感动。
引用leetcode评论

你变成我,走过我走过的路。
我变成你,走过你走过的路。
然后我们便相遇了..
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值