每日一题 160. 相交链表

160. 相交链表

难度:简单
语言:java

题目内容

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。
在这里插入图片描述

解法分析

本来现在我已经不记录简单题了,但是这题的解法很有意思,所以我还是记录一下,方便自己以后查看。解法真的还蛮多的

  1. 暴力解法:双重遍历似乎也是能过的,但是这个解法没啥意思就不说了
  2. 哈希表:因为哈希表在这里可以存地址,所以只要地址相同就有值重复的点啦,可以先遍历一条链表,再进行查询
  3. 这个是我想记录一下的解法,不仅仅适用于链表我觉得,很多位数不同的解法都可以使用这个思路。
    在这里插入图片描述
    答案还考虑了空链表问题,其实在这里不需要考虑,应该如果是空,那直接就返回null了
public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        ListNode pa = headA , pb = headB;
        while(pa != pb){
            pa = pa == null ?  headB : pa.next;
            pb = pb == null ?  headA : pb.next;
        }
        return pa; 
    }
}
  1. 差值走法。这个方法本来我想的是,既然后面的值都相同,那只要用两个list存下所有的值,自后向前比较直到有不同的值即可,但是这样比较麻烦。有个更好的思路是先对两条链表扫描一遍,取得两者长度,然后让长的链表先走「两者的长度差值」,然后再同时走,遇到第一个节点即是答案。弥补两个值的区别就可以解决问题,并且不需要保存各个数的值了。
//直接借鉴宫水大神的解法粘贴。
public class Solution {
    public ListNode getIntersectionNode(ListNode a, ListNode b) {
        int c1 = 0, c2 = 0;
        ListNode t1 = a, t2 = b;
        while (t1 != null && ++c1 > 0) t1 = t1.next;
        while (t2 != null && ++c2 > 0) t2 = t2.next;
        int t = Math.abs(c1 - c2);
        while (t-- > 0) {
            if (c1 > c2) a = a.next;
            else b = b.next;
        }
        while (a != null && b != null) {
            if (a.equals(b)) {
                return a;
            } else {
                a = a.next;
                b = b.next;
            }
        }
        return null;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值