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;
        }
    }
    
  • 相关阅读:
    如何在一个页面后面随机跳转到多个链接地址Math.floor()和Math.random()
    thinkphp中volist标签
    PHP中删除数组空值的方法
    PHP实现四种基本排序算法
    如何解决自动加载与模板中(如Smarty)的自动加载冲突的问题
    GD库常用函数
    内网最小化安装CentOS后,想安装ISO文件中的包怎么办呢?
    Elasticsearch插件安装
    python类的反射使用方法
    python类的继承
  • 原文地址:https://www.cnblogs.com/xidian2014/p/8728254.html
Copyright © 2011-2022 走看看