leetcode LCR 023-相交链表-返回两个单链表相交的起始节点

本文介绍了三种方法解决LeetCode中的链表相交节点问题:使用栈查找第一个相同节点,将两个链表拼接再遍历,以及利用差分指针优化遍历。展示了如何通过地址比较而非值来确定节点是否相交。
摘要由CSDN通过智能技术生成

题目描述

leetcode--LCR 023


注意:该题比较的是两个链表节点的地址是否相同,而不是通过值相同去判断


方法一:使用栈

两个链表分别为list1、list2

list1 = 1 - 2 - 3 - 4 - 5

list2 = 4 - 4 - 5

思路:

把两个链表的元素都压入栈中,然后同时出栈,等到最后一个出栈的相同元素就是第一个开始相交的节点

代码

public static ListNode getIntersectionNode3(ListNode headA, ListNode headB) {
        Stack<ListNode> stackA = new Stack<>();
        Stack<ListNode> stackB = new Stack<>();
        //print(headA);
        while(headA != null){
            stackA.push(headA);
            headA = headA.next;
        }
        while(headB != null){
            stackB.push(headB);
            headB = headB.next;
        }
        ListNode node = null;
        //两个栈都不为空
        while(stackA.size()>0 && stackB.size()>0){
            //stackA.peek()返回栈顶元素,但不移除元素
            //stackA.pop()获取栈顶元素,但移除元素
            //在leetcode LCR 023题目中,要比较的是链表节点的地址相同,而不是值相同,所以不用值判断
            if(stackA.peek() == stackB.peek()){
                node = stackA.pop();
                stackB.pop();
            }else {
                break;
            }
        }
        /*if(node != null){
            System.out.println(node.val);
        }else{
            System.out.println("null");
        }*/

        return node;
    }

方法二:拼接两个链表

两个链表分别为list1、list2

list1 = 1 - 2 - 3 - 4 - 5

list2 = 4 - 4 - 5

思路:

把两个链表拼接成一个链表,如:

list1 = 1 - 2 - 3 - 4 - 5 - 4 - 4 - 5  ->null

list2 = 4 - 4 - 5 - 1 - 2 - 3 - 4 - 5  ->null

两个链表遍历后一定能找到相交的节点,若两个链表没有相交的节点,则链表遍历到最后都是null,就会直接返回null

代码:

public static ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        if(headA == null && headB == null){
            return null;
        }
        ListNode pa = headA;
        ListNode pb = headB;
        //判断是否到达公共节点
        while(pa != pb){
            pa = pa.next;
            pb = pb.next;
            //如果pa pb不存在交集,则会陷入死循环
            //若没有交集,则最后会变成 pa = pb = null,天然地return null
            if(pa != pb){
                //虽然是两个拼接链表,但可以一个访问完后跳到另外一个链表访问
                if(pa == null){
                    pa = headB;
                }
                if(pb == null){
                    pb = headA;
                }
            }
        }
        return pa;
    }

方法三:可以使用差和双指针解决

两个链表分别为list1、list2

list1 = 1 - 2 - 3 - 4 - 5

list2 = 4 - 4 - 5

思路:

如list1的长度为5,list2的长度位3,5 - 3 = 2,则较长的链表先向前走两个节点,即list1的此时头节点先走到 3 处,此时list1 = 3 - 4 - 5,list2 = 4 - 4 - 5,list1 和 list2则可以同时向后遍历,找到相同的节点即是相交节点。

代码:

代码会比较繁琐

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值