【Leetcode】160、相交链表 Intersection of Two Linked Lists

[Leetcode] 160、相交链表 Intersection of Two Linked Lists

一、题目描述

题目链接
https://leetcode-cn.com/problems/intersection-of-two-linked-lists/

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

如下面的两个链表**:**

image-20201007213909281

image-20201007213931496

image-20201007214008539

image-20201007214022962

今天开始分块刷题嘞!

首先先刷刷链表吧!

最开始小白整了半天,愣是没看懂题目输入啥意思?

image-20201007213302448

后来才发现,题目原来只输入俩链表?

最开始整了半天,暴力无果,遂看答案。

这道题最棘手的事儿就是两个链表长度不同,如果长度相同那就太好办了。

看了看答案发现还是精妙。

具体做法:

  1. 指针 pA 指向 A 链表,指针 pB 指向 B 链表,依次往后遍历
  2. 如果 pA 到了末尾,则 pA = headB 继续遍历
  3. 如果 pB 到了末尾,则 pB = headA 继续遍历
  4. 比较长的链表指针指向较短链表head时,长度差就消除了
  5. 如此,只需要将最短链表遍历两次即可找到位置

这视频挺有意思

浪漫求解视频

贴代码

2、我的代码

/**
 * 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) {
        ListNode aHead = headA;
        ListNode bHead = headB;
        boolean aflag = true;
        boolean bflag = true;
        while(aHead!=null||bHead!=null){
            if(aHead==null&&aflag){
                aHead = new ListNode(-55);
                aHead.next = headB;
                aflag = false;
            }
            if(bHead==null&&bflag){
                bHead = new ListNode(-56);
                
                bHead.next = headA;
                bflag = false;
            }
            if(aHead!=null&&bHead!=null&&aHead == bHead){
                return aHead;
            }
            aHead = aHead.next;
            bHead = bHead.next;
            
            
        }
        return null;
    }
}

小白写的代码就是垃圾。。

3、大神的代码

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值