zoukankan      html  css  js  c++  java
  • 160 Intersection of Two Linked Lists 相交链表

    编写一个程序,找到两个单链表相交的起始节点。
    例如,下面的两个链表:
    A:           a1 → a2
                                ↘
                                    c1 → c2 → c3
                                ↗            
    B:  b1 → b2 → b3
    在节点 c1 开始相交。
    注意:
        如果两个链表没有交点,返回 null.
        在返回结果后,两个链表仍须保持原有的结构。
        可假定整个链表结构中没有循环。
        程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。
    详见:https://leetcode.com/problems/intersection-of-two-linked-lists/description/

    Java实现:

    方法一:借助栈

    /**
     * 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;
            }
            Stack<ListNode> stk1=new Stack<ListNode>();
            Stack<ListNode> stk2=new Stack<ListNode>();
            while(headA!=null){
                stk1.push(headA);
                headA=headA.next;
            }
            while(headB!=null){
                stk2.push(headB);
                headB=headB.next;
            }
            if(stk1.peek()!=stk2.peek()){
                return null;
            }
            ListNode commonNode=null;
            while(!stk1.isEmpty()&&!stk2.isEmpty()&&stk1.peek()==stk2.peek()){
                commonNode=stk1.pop();
                stk2.pop();
            }
            return commonNode;
        }
    }
    

     方法二:

    /**
     * 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;
            }
            int n=0;
            ListNode head1=headA;
            ListNode head2=headB;
            while(head1!=null){
                ++n;
                head1=head1.next;
            }
            while(head2!=null){
                --n;
                head2=head2.next;
            }
            ListNode longHead=n>0?headA:headB;
            ListNode shortHead=longHead==headA?headB:headA;
            n=n>0?n:-n;
            for(int i=0;i<n;++i){
                longHead=longHead.next;
            }
            while(longHead!=shortHead){
                longHead=longHead.next;
                shortHead=shortHead.next;
            }
            return longHead;
        }
    }
    
  • 相关阅读:
    FreeMarker中<#include>和<#import>标签的区别
    freemarker自定义标签(与java合用)
    JSP页面中验证码的调用方法
    js关闭或者刷新页面后执行事件
    动态生成能够局部刷新的验证码【AJAX技术】---看了不懂赔你钱
    Delphi中Indy 10的安装和老版本的卸载
    在Delphi中关于UDP协议的实现
    Easy smart REST with kbmMW
    Delphi事件的广播
    js调用跨域
  • 原文地址:https://www.cnblogs.com/xidian2014/p/8728254.html
Copyright © 2011-2022 走看看