zoukankan      html  css  js  c++  java
  • 剑指Offer编程题(Java实现)——两个链表的第一个公共结点

    题目描述:

    输入两个链表,找出它们的第一个公共结点。

    思路一:

     设 A 的长度为 a + c,B 的长度为 b + c,其中 c 为尾部公共部分长度,可知 a + c + b = b + c + a。

    当访问链表 A 的指针访问到链表尾部时,令它从链表 B 的头部重新开始访问链表 B;同样地,当访问链表 B 的指针访问到链表尾部时,令它从链表 A 的头部重新开始访问链表 A。这样就能控制访问 A 和 B 两个链表的指针能同时访问到交点。

    实现:

    /*
    public class ListNode {
        int val;
        ListNode next = null;
    
        ListNode(int val) {
            this.val = val;
        }
    }*/
    public class Solution {
        public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
            // 很厉害的解法
            ListNode l1 = pHead1, l2 = pHead2;
            while (l1 != l2) {
                l1 = (l1 == null) ? pHead2 : l1.next;
                l2 = (l2 == null) ? pHead1 : l2.next;
            }
            return l1;
            
        }
    }

    运行时间:19ms

    占用内存:9528k

    思路二:

    暴力双循环迭代

    实现:

    /*
    public class ListNode {
        int val;
        ListNode next = null;
    
        ListNode(int val) {
            this.val = val;
        }
    }*/
    public class Solution {
        public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {
            // 暴力解法
            ListNode tmp1 = pHead1;
            ListNode tmp2 = pHead2;
            while(tmp1 != null){
                while(tmp2 != null){
                    if(tmp1 == tmp2)
                        return tmp1;
                    tmp2 = tmp2.next;
                }
                tmp2 = pHead2;
                tmp1 = tmp1.next;
            }
            return null;
        }
    }

    运行时间:21ms

    占用内存:9680k

    思路参考:https://www.nowcoder.com/discuss/198840

  • 相关阅读:
    实现手机页面转换
    Activity到另一个Acivity
    Android简单的Button事件处理
    样式定义Android界面样式
    更改手机窗口画面底色——color.xml定义颜色
    搭建每日构建环境
    perl常用语法
    perl开发文档
    IT项目实施规范
    快速开发php扩展
  • 原文地址:https://www.cnblogs.com/MWCloud/p/11323173.html
Copyright © 2011-2022 走看看