本文写作想法来源于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评论
你变成我,走过我走过的路。
我变成你,走过你走过的路。
然后我们便相遇了..