习题——俩个链表的第一个公共节点

俩个链表的第一个公共节点

1.题意描述
  • 输入两个链表,找出它们的第一个公共节点。
2.输入输出描述
  • 如下图,公共节点就是8这个节点
    在这里插入图片描述
3.代码实现
  • 第一种方法,用HashSet的不重复性
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    //第一种:用HashSet
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        //可以选择set将A全部放进去,然后遍历B,如果有直接返回节点,最后返回null;
        Set<ListNode> set = new HashSet<>();
        while(headA != null){
            set.add(headA);
            headA = headA.next;
        }

        while(headB != null){
            if(set.contains(headB)){
                return headB;
            }
            headB = headB.next;
        }
        return null;
}
}
  • 第二种方法;遍历,如果俩个链表长度不一样,让长度一样的先走,等他们俩个长度一致,一起走,然后相同的节点就是结果
    在这里插入图片描述
在这里插入代码片/**
 * 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) {
        //2.让链表长度长的先走,直到他们俩个长度一致,然后一起走,直达找到一样的返回,否则就返回null;
       int lenA = length(headA); int lenB = length(headB);
        while(lenA != lenB){
            if(lenA > lenB){
                headA = headA.next;
                lenA--;
            }else{
                headB = headB.next;
                lenB--;
            }
        }
        //到了这里俩者长度一致,一起走
        while(headA != null){
            if(headA == headB){
                return headA;
            }
            headA = headA.next;
            headB = headB.next;

        }
        return null;
    }
    //统计链表的长度
private int length(ListNode node) {
    int length = 0;
    while (node != null) {
        node = node.next;
        length++;
    }
    return length;
}
}
  • 第三种方法
  1. 俩个链表同时开始遍历,如果链表A走完,然后从B的头节点开始遍历;
  2. 同样B走完了,从A的头节点开始遍历;
  3. 一直到他们俩个遍历的节点重合就是结果;
    在这里插入图片描述
    在这里插入图片描述
在这里插入代码片/**
 * 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) {
    //第三种
    //tempA和tempB我们可以认为是A,B两个指针
    ListNode tempA = headA;
    ListNode tempB = headB;
    while (tempA != tempB) {
        //如果指针tempA不为空,tempA就往后移一步。
        //如果指针tempA为空,就让指针tempA指向headB(注意这里是headB不是tempB)
        tempA = tempA == null ? headB : tempA.next;
        //指针tempB同上
        tempB = tempB == null ? headA : tempB.next;
    }
    //tempA要么是空,要么是两链表的交点
    return tempA;
}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值