zoukankan      html  css  js  c++  java
  • 160. 相交链表

    160. 相交链表

    1、试题介绍

    编写一个程序,找到两个单链表相交的起始节点。

    试题链接:https://leetcode-cn.com/problems/intersection-of-two-linked-lists/

    2、java做法

    2.1、双重循环

        public static ListNode getIntersectionNode(ListNode headA, ListNode headB) {
            if(headA == null || headB == null) return null;
            while (headA != null) {
                ListNode p = headB;
                while (p != null) {
                    if(headA == p) {
                        return headA;
                    }
                    p = p.next;
                }
                headA = headA.next;
            }
            return null;
        }
    

    测试结果:

    2.2、双指针做法

        public static ListNode getIntersectionNode(ListNode headA, ListNode headB) {
            if(headA == null || headB == null) return null;
    
            ListNode pA = headA;
            ListNode pB = headB;
    
            int sizeA = 0;
            int sizeB = 0;
            while (pA != null || pB != null) {
                if(pA != null) {
                    sizeA++;
                    pA = pA.next;
                }
                if(pB != null) {
                    sizeB++;
                    pB = pB.next;
                }
            }
    
            pA = headA;
            pB = headB;
            if(sizeA > sizeB) {
                for(int i = 0;i < sizeA - sizeB;i++) {
                    pA = pA.next;
                }
            }else {
                for(int i = 0;i < sizeB - sizeA;i++) {
                    pB = pB.next;
                }
            }
    
            while (pA != pB ) {
                if(pA == null || pB == null) return null;
    
                pA = pA.next;
                pB = pB.next;
            }
    
            return pA;
        }
    

    测试结果:

    3、C语言做法

    3.1、双重循环

    struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
            if(headA == NULL || headB == NULL) return NULL;
            while (headA != NULL) {
                struct ListNode* p = headB;
                while (p != NULL) {
                    if(headA == p) {
                        return headA;
                    }
                    p = p->next;
                }
                headA = headA->next;
            }
            return NULL;
    }
    

    测试结果:

    3.2、双指针做法

    struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
        if(headA == NULL || headB == NULL) return NULL;
    
        struct ListNode* pA = headA;
        struct ListNode* pB = headB;
    
        int sizeA = 0;
        int sizeB = 0;
        while (pA != NULL || pB != NULL) {
            if(pA != NULL) {
                sizeA++;
                pA = pA->next;
            }
            if(pB != NULL) {
                sizeB++;
                pB = pB->next;
            }
        }
    
        pA = headA;
        pB = headB;
        if(sizeA > sizeB) {
            for(int i = 0;i < sizeA - sizeB;i++) {
                pA = pA->next;
            }
        }else {
            for(int i = 0;i < sizeB - sizeA;i++) {
                pB = pB->next;
            }
        }
    
        while (pA != pB ) {
            if(pA == NULL || pB == NULL) return NULL;
    
            pA = pA->next;
            pB = pB->next;
        }
    
        return pA;
    }
    

    测试结果:

  • 相关阅读:
    Cookie的小知识
    ASP.NET 杂记
    Ajax方式的Banner总结
    客户端·优化
    SQL中灵活运用Group by 和 Order by
    怎样才能容易更换DB
    txt编写第一个控制台程序
    ASP.NET MVC3数据绑定到VIEW的方式
    XML和Xpath定位小结
    ASP.NET 服务器控件对应HTML标签
  • 原文地址:https://www.cnblogs.com/xgp123/p/12397561.html
Copyright © 2011-2022 走看看