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;
    }
    
  • 相关阅读:
    JavaScript监听、设置全部ajax访问属性获取返回值(状态码)
    如何在Vue项目中使用vw实现移动端适配
    git 常用命令金字教程
    移动web开发之像素和DPR详解
    小程序-微信开发者工具使用
    小程序开发框架:Taro(一)基础篇
    vscode代码自动补全失效
    JS、C#编码解码
    PHP网页缓存技术
    ajaxfileupload回到json带<pre>
  • 原文地址:https://www.cnblogs.com/optor/p/8617035.html
Copyright © 2011-2022 走看看