剑指offer java版 test36—找出两个链表的第一个公共结点

  1. 前言:
    在用Stack ArrayList等容器时,一定要加泛型。第二次犯这个错误了。
    Stack没加ListNode泛型,导致我result=stack1.peek();这个代码总是显示错误
  2. 题目:

输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)

  1. 思路:第一个公共结点后的部分都是公共的,那么把两个链表反转,反转后,从前往后遍历,找最后一个相同的结点就行了。(错误示范啊,第一条链表反转的时候,因为两条链表有公共部分,会改变第二条链表)
    。。方法1:然后回到我最初的想法,利用长度来做,前面的题目也有类似的思维,比如链表a比链表b长,那么让链表a先走(a-b)步,然后两个链表一起走,这样就会同时到达公共结点。
    。。 方法2:利用栈来做,这种可以从后往前的,利用栈的特性就很好。存储后,两个链表对应栈顶的元素都是相同的,一个一个的比较取出。

  2. 代码:

import java.util.Stack;
class Solution2 {
    public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
        ListNode result=null;
        Stack<ListNode> stack1=putintoStack(pHead1);//一定要加泛型
        Stack<ListNode> stack2=putintoStack(pHead2);

        while(!stack1.isEmpty()&&!stack2.isEmpty()&&stack1.peek()==stack2.peek()){
           result=stack1.peek();
            stack1.pop();
            stack2.pop();
        }
        return result;
    }

    //将链表结点存入栈
    public Stack<ListNode> putintoStack(ListNode pHead1){
        Stack<ListNode> stack=new Stack();
        while(pHead1!=null){
            stack.push(pHead1);
            pHead1=pHead1.next;
        }
        return stack;
    }
}


class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读