两个链表的第一个公共节点(相交链表),剑指offer,力扣

目录

题目地址:

题目:

我们直接看题解吧:

解题方法:

审题目+事例+提示:

解题思路(双指针):

具体思路流程:

代码实现:

算法思路补充证明:


力扣题目地址:

160. 相交链表 - 力扣(LeetCode)

难度:简单

今天刷两个链表的第一个公共节点(相交链表),大家有兴趣可以点上看看题目要求,试着做一下。

题目:

两个链表的第一个公共节点(相交链表),剑指offer,力扣_第1张图片

我们直接看题解吧:

解题方法:

方法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
    }
}

算法思路补充证明:

两个链表的第一个公共节点(相交链表),剑指offer,力扣_第2张图片

两个链表的第一个公共节点(相交链表),剑指offer,力扣_第3张图片


最后送上一句热评:

对的人错过了还是会相遇, 错的人相遇了也是NULL

(痛,太痛了,我就说恋爱脑不适合做题)

你可能感兴趣的:(剑指offer,#,链表,leetcode)