首页 > 其他分享 >Leetcode 160. 链表相交(Intersection of two linked lists lcci)

Leetcode 160. 链表相交(Intersection of two linked lists lcci)

时间:2023-08-18 23:56:44浏览次数:38  
标签:tempB tempA ListNode two next 链表 null linked

题目链接

给定两个单链表的头节点headA和headB, 请找出并返回两个单链表相交的起始节点. 如果两个链表没有交点, 返回null.

图示两个链表在节点c1开始相交, 题目数据保证整个链式结构中不存在环.

示例 1:

输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3
输出:Intersected at '8'
解释:相交节点的值为 8 (注意,如果两个链表相交则不能为 0)。
从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。
在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。

示例 2:

输入:intersectVal = 2, listA = [0,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1
输出:Intersected at '2'
解释:相交节点的值为 2 (注意,如果两个链表相交则不能为 0)。
从各自的表头开始算起,链表 A 为 [0,9,1,2,4],链表 B 为 [3,2,4]。
在 A 中,相交节点前有 3 个节点;在 B 中,相交节点前有 1 个节点。

提示:

  • listA 中节点数目为 m
  • listB 中节点数目为 n
  • 0 <= m, n <= 3 * 104
  • 1 <= Node.val <= 105
  • 0 <= skipA <= m
  • 0 <= skipB <= n
  • 如果 listA 和 listB 没有交点,intersectVal 为 0
  • 如果 listA 和 listB 有交点,intersectVal == listA[skipA + 1] == listB[skipB + 1]

思路

这道题首先想到的是将链表A的每个节点存入Set, 再使用链表B去挨个比对, 若比对成功返回, 否则返回null即可.

第二想到的方法是使两个链表的临时指针在同一位置上, 同时前进, 比对指向的值是否一致.

在看到Leetcode题解后发现还有第三种方法, 双指针法. 首先在链表A和B处各定义一个临时指针, 同时向前遍历, 若指针为空则指向另一条链表继续遍历, 当两指针指向同一节点时返回目标节点, 或返回null.

代码实现

HashSet:

/**
 * 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) {
        Set<ListNode> set = new HashSet<ListNode>();
        ListNode temp = headA;

        while(temp != null) {
            set.add(temp);
            temp = temp.next;
        }

        temp = headB;

        while(temp != null) {
            if(set.contains(temp)) {
                return temp;
            }
            temp = temp.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) {
        if(headA == null || headB == null) {
            return null;
        }

        ListNode tempA = headA;
        ListNode tempB = headB;

        while(tempA != tempB) {
            tempA = tempA == null ? headB : tempA.next;
            tempB = tempB == null ? headA : tempB.next;
        }

        return tempA;
    }
}

暴力解法:

/**
 * 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) {
        int lenA = 0;
        int lenB = 0;
        ListNode tempA = headA;
        ListNode tempB = headB;

        // 确定链表A的长度
        while(tempA != null) {
            tempA = tempA.next;
            lenA++;
        }

        // 确定链表B的长度
        while(tempB != null) {
            tempB = tempB.next;
            lenB++;
        }

        // 临时节点复位
        tempA = headA;
        tempB = headB;

        // 使链表A为最长的
        if(lenB > lenA) {
            // swap(lenA, lenB)
            int tempLen = lenA;
            lenA = lenB;
            lenB = tempLen;

            // swap(tempA, tempB)
            ListNode tempNode = tempA;
            tempA = tempB;
            tempB = tempNode;
        }

        int gap = lenA - lenB;  // 长度差

        // 使tempA和tempB在同一起点上
        while(gap-- > 0) {
            tempA = tempA.next;
        }

        // 遍历
        while(tempA != null) {
            if(tempA == tempB) {
                return tempA;
            }
            tempA = tempA.next;
            tempB = tempB.next;
        }

        return null;
    }
}

标签:tempB,tempA,ListNode,two,next,链表,null,linked
From: https://www.cnblogs.com/ahci316/p/17641856.html

相关文章

  • 剑指 Offer 36. 二叉搜索树与双向链表
    本题比较重要的有两点:1.一般认为有序的二叉搜索树,都是中序遍历。2.中序遍历的递归顺序,得到的就是排好序的,就是链表的顺序,因此只需管遍历的过程中的链表指向即可。classSolution{public://pre将来指向尾节点,head指向头节点Node*pre=nullptr,*head=nullptr;......
  • 代码随想录算法训练营第三天| 203.移除链表元素 ,707.设计链表 ,206.反转链表
    203.移除链表元素题目给你一个链表的头节点head和一个整数val,请你删除链表中所有满足Node.val==val的节点,并返回新的头节点。第一想法定义一个指针a指向头节点,顺序遍历链表,循环结束的条件是指针a.next为null删除操作是判断a.next.val=val时让a.next=a.next.nex......
  • LCR 026. 重排链表
    LCR026.重排链表/***Definitionforsingly-linkedlist.*publicclassListNode{*intval;*ListNodenext;*ListNode(){}*ListNode(intval){this.val=val;}*ListNode(intval,ListNodenext){this.val=val;this.next......
  • C习题-链表
    1.在一个长度为 n ( n>1 )的单链表上,设有头和尾两个指针,执行()操作与链表的长度有关。A、删除单链表中的第一个元素B、删除单链表中的最后一个元素C、在单链表第一个元素前插入一个新元素D、在单链表最后一个元素后插入一个新元素答案:B;需要遍历至最后一个元素的......
  • 【leetcode】1.two sum
    第一题给我干懵了...想达到这个要求把我脑壳都想痛了...Follow-up:CanyoucomeupwithanalgorithmthatislessthanO(n2)timecomplexity?一开始想过用map,但是不能解决重复key的问题。然而我用sort,这个时间复杂度也不好确定。假装我只用了O(n)!(搓手手)(溜走)xxxclassSol......
  • 链表的创建&遍历打印
    博客地址:https://www.cnblogs.com/zylyehuo/#-*-coding:utf-8-*-classNode:def__init__(self,item):self.item=itemself.next=None#头插法defcreate_linklist_head(li):head=Node(li[0])forelementinli[1:]:......
  • Two-round n-out-of-n and Multi-Signatures and Trapdoor Commitment from Lattices
    Abstract.Althoughtheyhavebeenstudiedforalongtime,distributedsignatureprotocolshavegarneredrenewedinterestinrecentyearsinviewofnovelapplicationstotopicslikeblockchains.MostrecentworkshavefocusedondistributedversionsofE......
  • Leetcode 19. 删除链表的倒数第N个结点(Remove nth node from end of list)
    题目链接给你一个链表,删除链表的倒数第n个结点,并且返回链表的头结点.示例1:输入:head=[1,2,3,4,5],n=2输出:[1,2,3,5]示例2:输入:head=[1],n=1输出:[]提示:链表中结点的数目为sz1<=sz<=300<=Node.val<=1001<=n<=sz思路暴力解法:可以先......
  • 顺序表与链表
    顺序表与链表前言  基础数据结构的学习主要包括两个部分,即【结构定义】与【结构操作】。顾名思义,结构定义就是定义某种或多种性质,再通过相关的结构操作去维护这种性质。对于初学者来说数据结构的学习不能抽象的理解,还需要结合动态的、可视化的工具去理解。下面给出美国旧金山......
  • rails3学习系列(二)MVC---NetworkError: 500 Internal Server Error
    当我创建了一个control文件:backup_for_sqlserver_controller.rb              classBackupForSqlServerController<ScreenController                   defconfig_wizard                   end          ......