zoukankan      html  css  js  c++  java
  • 160. Intersection of Two Linked Lists

    原题链接:https://leetcode.com/problems/intersection-of-two-linked-lists/description/
    这道题目貌似没说这两个单链表是排序的,刚开始我以为是排序的单链表呢,然后我写下了如下的答案,并且通过了。。。

    /**
     * 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;
            }
            while ((headA.next != null || headB.next != null) && headA != headB) {
                if (headA.val < headB.val) {
                    if (headA.next != null) {
                        headA = headA.next;
                    } else {
                        break;
                    }
                } else {
                    if (headB.next != null) {
                        headB = headB.next;
                    } else {
                        break;
                    }
                }
            }
            return headA == headB ? headA : null;
        }
    }
    

    然后,我去看了下官方的解答才知道这道题目并没有说这两个单链表是排序链表呢!那么,没有排序的两个链表该怎么处理呢?官方给出了三种解答:

    1. 双层循环进行暴力遍历
    2. 基于第一种方法,使用哈希表来加快查找速度
    3. 官方解释我是没看懂,说是用两个指针的方法。。不过下面别人贴的代码我倒是看懂了
    int getListLength(ListNode* head) {
        int len = 0;
        while (head) {
            ++len;
            head = head->next;
        }
        return len;
    }
    
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        if (headA == nullptr || headB == nullptr) {
            return nullptr;
        }
        int ALen = getListLength(headA);
        int BLen = getListLength(headB);
        if (ALen < BLen) {
            std::swap(ALen, BLen);
            std::swap(headA, headB);
        }
        for (int i = 0; i < ALen - BLen; ++i) {
            headA = headA->next;
        }
        for (int i = 0; i < BLen; ++i) {
            if (headA == headB) {
                return headA;
            }
            headA = headA->next;
            headB = headB->next;
        }
        return nullptr;
    }
    
  • 相关阅读:
    GET和POST两种基本请求方法的区别
    GET与POST类型接口
    TCP连接与断开详解(socket通信)
    QC02
    QC01
    tcp三次握手和四次挥手
    ssh整合
    redis主从切换
    缓存解释(一级缓存,二级缓存)
    cxf整合spring代码
  • 原文地址:https://www.cnblogs.com/optor/p/8617035.html
Copyright © 2011-2022 走看看