首页 > 其他分享 >力扣 160 相交链表

力扣 160 相交链表

时间:2022-11-17 18:47:30浏览次数:45  
标签:力扣 lenB cur2 cur1 链表 ListNode 160 节点

题目:

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。
题目数据保证整个链式结构中不存在环。
注意,函数返回结果后,链表必须保持其原始结构。
图示两个链表在节点 c1 开始相交:

 

示例:

输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,6,1,8,4,5], skipA = 2, skipB = 3
输出:Intersected at '8'
解释:相交节点的值为 8 (注意,如果两个链表相交则不能为 0)。
从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,6,1,8,4,5]。
在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。
— 请注意相交节点的值不为 1,因为在链表 A 和链表 B 之中值为 1 的节点 (A 中第二个节点和 B 中第三个节点) 是不同的节点。换句话说,它们在内存中指向两个不同的位置,而链表 A 和链表 B 中值为 8 的节点 (A 中第三个节点,B 中第四个节点) 在内存中指向相同的位置。

 

思路踩坑:

两个指针各遍历一遍,相等了直接返回。

public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        ListNode cur1=headA;
        ListNode cur2=headB;
        while(cur1!=null){
            while(cur2!=null){
                if(cur1.val==cur2.val){
                    return cur1;
                }
                cur2=cur2.next;
            }
            cur1=cur1.next;
        }
        return null;
    }
}

  第一个测试用例就报错了,当第一个链表的4遇到第二个链表的4直接返回了,但是并不符合题目要求。

  题目要求的是交点,不是数值相等,而是指针相等。

正确的思路应当是:

  我们求出两个链表的长度,并求出两个链表长度的差值,然后让cur1移动到,和cur2 末尾对齐的位置,如图:

面试题02.07.链表相交_2

  此时我们就可以比较curA和curB是否相同,如果不相同,同时向后移动cur1和cur2,如果遇到cur1 == cur2,则找到交点。否则循环退出返回空指针。

public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        ListNode cur1=headA;
        ListNode cur2=headB;
        int lenA = 0, lenB = 0;
        while (cur1 != null) { // 求链表A的长度
            lenA++;
            cur1 = cur1.next;
        }
        while (cur2 != null) { // 求链表B的长度
            lenB++;
            cur2 = cur2.next;
        }
        //再重新指向头结点
        cur1 = headA;
        cur2 = headB;
        //假设lenA>lenB,如果lenB更大,两个链表交换
        if(lenB>lenA){
             //1. swap (lenA, lenB);
            int tmpLen = lenA;
            lenA = lenB;
            lenB = tmpLen;
            //2. swap (curA, curB);
            ListNode tmpNode = cur1;
            cur1 = cur2;
            cur2 = tmpNode;
        }
        int len=lenA-lenB;
        while(len-->0){//让cur1走到和cur2一起的位置
            cur1=cur1.next;
        }
        while(cur1!=null){//cur1和cur2同时走
            if(cur1==cur2){//相等则返回
                return cur1;
            }
            cur1=cur1.next;
            cur2=cur2.next;
        }
        return null;
    }
}

 

标签:力扣,lenB,cur2,cur1,链表,ListNode,160,节点
From: https://www.cnblogs.com/cjhtxdy/p/16899940.html

相关文章

  • [力扣] 剑指 Offer 第三天 - 替换空格
    耐心和持久胜过激烈和狂热。题目来源来源:力扣(LeetCode)链接:​​https://leetcode.cn/problems/ti-huan-kong-ge-lcof​​著作权归领扣网络所有。商业转载请联系官方授权,非......
  • 双向链表
    双向链表示意图双向列表由三部分组成链表头(由结点担任,它的前一个结点是null)结点链表尾(由结点担任,它的后一个结点是null)结点之间按照线性顺序,指向前一个结点,指向后一......
  • 力扣19 删除链表的倒数第N个结点
    题目:给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例: 输入:head=[1,2,3,4,5],n=2输出:[1,2,3,5] 思路:给两个指针,让快指针和慢指......
  • 力扣 235. 二叉搜索树的最近公共祖先
    235.二叉搜索树的最近公共祖先给定一个二叉搜索树,找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树T的两个结点p、q,最近......
  • 3.双向链表
    使用带head头的双向链表实现-水浒英雄排行榜管理的优缺点分析  1.单向链表,查找的方向只能是一个方向,而双向链表可以向前或者向后查找  2.单向项链表不能自我删除,需要......
  • 2. 两数相加 ----- 链表末尾赋值0,模拟
    给你两个 非空的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和......
  • 单链表
    https://www.acwing.com/problem/content/828/ ////CreatedbyGeneson2020/12/12.////数组模拟单链表#include<iostream>usingnamespacestd;constint......
  • 力扣374(java&python)-猜数字大小(简单)
    题目:猜数字游戏的规则如下:每轮游戏,我都会从 1 到 n随机选择一个数字。请你猜选出的是哪个数字。如果你猜错了,我会告诉你,你猜测的数字比我选出的数字是大了还是小了......
  • 141. 环形链表 ----- 哈希表、逆向思维、快慢指针
    给你一个链表的头节点head,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整......
  • 力扣 153. 寻找旋转排序数组中的最小值 [二分变种]
    153.寻找旋转排序数组中的最小值已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums=[0,1,2,4,5,6,7] 在变......