目录
题目地址:
题目:
我们直接看题解吧:
解题方法:
审题目+事例+提示:
解题思路(双指针):
具体思路流程:
代码实现:
算法思路补充证明:
力扣题目地址:
160. 相交链表 - 力扣(LeetCode)
难度:简单
今天刷两个链表的第一个公共节点(相交链表),大家有兴趣可以点上看看题目要求,试着做一下。
题目:
我们直接看题解吧:
解题方法:
方法1哈希表,
方法2、双指针(或者拼接链表)
审题目+事例+提示:
根据题意如果两链表相交或者有公共节点, 二者的相交部分的长度是一样的。
解题思路(双指针):
方法的主要思想是比较遍历(走过)链表的长度(或者说路程)
·当两个链表长度相同,那么大家各自从头结点往后遍历,
·当链表的长度不同时,就需要消除两个链表长度差。
假设a,b分别为两链表A,B非公共部分,c为公共部分
若相交,链表A: a+c, 链表B : b+c. 那么a+c+b+c = b+c+a+c ,则会在公共处c起点相遇。
若不相交,a +b = b+a 。因此相遇处是NULL,即分别指向各自链表尾部
具体思路流程:
1、设置两个头指针PA、PB分别指向链表A、链表B
2、PA遍历链表A,当遍历到链表A尾部时,将headB头指针赋值给PA,PA开始遍历链表B,PB同理;
3、如果两个链表中有公共的结点,PA和PB将会在某一处相遇,判断PA和PB是否相等即可;
4、如果两个链表中没有公共的结点,那PA和PB都将会遍历到链表的尾部,链表的尾部为null,那么PA、PB也会相等,但返回的是null。即PA=PB=null
代码实现:
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if (headA == null || headB == null) { //判断链表是否为空,空则返回null
return null;
}
ListNode pA = headA, pB = headB; //设置两个头指针,分别指向两个链表
//循环(遍历)结束条件是两个指针相等(或者说相遇)
//相等情况要么同时指向null(不相交),要么存在公共节点部分(相交)
while (pA != pB) {
//若PA为null即指向链表尾部,将指针改为指向另一个链表,
//若PA不为null,则继续遍历当前链表的下一位
pA = pA == null ? headB : pA.next;
//同上
pB = pB == null ? headA : pB.next;
}
return pA;//返回PA或PB
}
}
算法思路补充证明:
最后送上一句热评:
对的人错过了还是会相遇, 错的人相遇了也是NULL
(痛,太痛了,我就说恋爱脑不适合做题😭)