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;
        }
    }
    
  • 相关阅读:
    关于ArcMap中的地图文档单位
    洛谷—— P2983 [USACO10FEB]购买巧克力Chocolate Buying
    COGS——T 826. [Tyvj Feb11] GF打dota
    洛谷—— P1855 榨取kkksc03
    洛谷—— P2663 越越的组队
    COGS——T 1578. 次小生成树初级练习题
    Django中间件
    March 7 2017 Week 10 Tuesday
    March 6 2017 Week 10 Monday
    March 5 2017 Week 10 Sunday
  • 原文地址:https://www.cnblogs.com/xidian2014/p/8728254.html
Copyright © 2011-2022 走看看