小萌新开始做题啦!----------相交链表

总算开始了第一次的博客。内心战战兢兢o(╥﹏╥)o

下面来自LeetCode的一道链表题。

题目描述:

编写一个程序,找到两个单链表相交的起始节点。

如下面的两个链表

在节点 c1 开始相交。

注意:

    1.如果两个链表没有交点,返回 null.
    2.在返回结果后,两个链表仍须保持原有的结构。
    3.可假定整个链表结构中没有循环。
    4.程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/intersection-of-two-linked-lists


解题思路:

        刚拿到题目,想的是对A的每一个结点,遍历B并且寻找第一个相同的结点,时间复杂度为O(mn)!!!!

       但题目要求时间复杂度为O(n),然后再想一下,................  

       思路大概是对AB两个链表分别遍历进行比较,但是必须是相同长度的链表,那么就先把长链表在与短链表相交前多出来的部分截掉,所以就是先求长度,将长链表在(长链表.length - 短链表.length)处开始遍历,短链表从头遍历,然后相同时就是相交的结点处,返回,如果两个链表没有相交,则两指针最终都指向Null,则返回Null,Over~

我的代码:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */

public class Solution {
    public static int getLength(ListNode head){
        int count=0;
        ListNode cur=head;
        while(cur!=null){
            cur=cur.next;
            count++;
        }
        return count;
    }
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        int a=getLength(headA);
        int b=getLength(headB);
        ListNode cur1=headA;
        ListNode cur2=headB;
        if(a>=b){
            for(int i=0;i<a-b;i++){
                cur1=cur1.next;
            }
        }else{
            for(int i=0;i<b-a;i++){
                cur2=cur2.next;
            }
        }
         while(cur1!=null&&cur1!=cur2){
            cur1=cur1.next;
            cur2=cur2.next;
        }
        return cur1;
    }
}

       看着自己的代码,emmmmmmmm,自我感觉良好,然后秉着学习的态度,就去评论区逛了一下,噗,果然我就是个萌新。

大佬的优雅代码:

public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
    if (headA == null || headB == null) return null;
    ListNode pA = headA, pB = headB;
    while (pA != pB) {
        pA = pA == null ? headB : pA.next;
        pB = pB == null ? headA : pB.next;
    }
    return pA;
}

原理应该就是,利用(a+b).length=(b+a).length,a是链表A除相交部分,b是链表B除相交部分。这段代码不仅省去了求长度差的时间,代码本身还简洁了不少,简直赏心悦目。

小萌新膝盖奉上。

感受:

最近总算知道要开始好好学习了,突然感觉学习的感觉真的炒鸡棒,理解了任何一点知识都会有一丝小开心~快让我沉浸于学习

这是博主第一次写博客,因为刚学Java不久,所以可能会有一些知识的欠缺导致一些错误,看到麻烦各位大佬在线指导~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值