刷题笔记-(LeetCode)-相交链表

本文最后更新于:May 13, 2023 pm

积土成山,风雨兴焉;积水成渊,蛟龙生焉;积善成德,而神明自得,圣心备焉。故不积跬步,无以至千里,不积小流无以成江海。齐骥一跃,不能十步,驽马十驾,功不在舍。面对悬崖峭壁,一百年也看不出一条裂缝来,但用斧凿,能进一寸进一寸,能进一尺进一尺,不断积累,飞跃必来,突破随之。

目录

题目链接

思路很重要!!!

AC代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if(headA==null || headB == null) return null;
ListNode lookA = headA;
ListNode lookB = headB;
while(lookA!=lookB){
lookA = lookA==null? headB:lookA.next;
lookB = lookB==null? headA:lookB.next;
}
return lookA;
}
}

思路

场景:现有两条路A和B,有交叉重叠部分C,一个人M1在A的起点,一个人M2在B的起点。两个人有相同的移动速度,那么,他们有可能相遇吗?

题目思路

本思路参考力扣题解,图也摘抄题解。 题解

两个链表从同距离末尾同等距离的位置开始遍历。这个位置只能是较短链表的头结点位置。为此,我们必须消除两个链表的长度差:

  • 指针 pA 指向 A 链表,指针 pB 指向 B 链表,依次往后遍历。

  • 如果 pA 到了末尾,则 pA = headB 继续遍历。

  • 如果 pB 到了末尾,则 pB = headA 继续遍历。

  • 比较长的链表指针指向较短链表head时,长度差就消除了。

如此,只需要将最短链表遍历两次即可找到位置

个人理解

简单理解就是:两条相同的长度的路,两个人用相同的速度,那么在相同的时间内他们走的长度一定是相同的,无非就是走的路不是同一条而已。你走了你自己的又走了我的,我走了我自己的又走了你的,那么最后一定是一样的。