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

    问题描述:

    Write a program to find the node at which the intersection of two singly linked lists begins.

    For example, the following two linked lists:

    A:          a1 → a2
                       ↘
                         c1 → c2 → c3
                       ↗            
    B:     b1 → b2 → b3
    

    begin to intersect at node c1.

    Notes:

    • If the two linked lists have no intersection at all, return null.
    • The linked lists must retain their original structure after the function returns.
    • You may assume there are no cycles anywhere in the entire linked structure.
    • Your code should preferably run in O(n) time and use only O(1) memory.

    Credits:
    Special thanks to @stellari for adding this problem and creating all test cases.

    解题思路:

    如果两个linkedlist有相交的地方,纳闷他们的后半部分是相同的。

    这说明我们可以开始从登长的地方开始搜索。

    将长的链表的指针移动到与短链表长度相同的起始处,开始比较是否相同。

    代码:

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
        ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
            if(!headA || !headB)
                return NULL;
            int lenA = getLen(headA);
            int lenB = getLen(headB);
            ListNode* curA = headA;
            ListNode* curB = headB;
            if(lenA > lenB){
                int diff = lenA - lenB;
                while(diff > 0){
                    curA = curA->next;
                    diff--;
                }
            }else if(lenA < lenB){
                int diff = lenB - lenA;
                while(diff > 0){
                    curB = curB->next;
                    diff--;
                }
            }
            while(curA && curB){
                if(curA == curB)
                    return curA;
                curA = curA->next;
                curB = curB->next;
            }
            return NULL;
        }
    private:
        int getLen(ListNode *head){
            int ret = 0;
            ListNode *cur = head;
            while(cur){
                ret++;
                cur = cur->next;
            }
            return ret;
        }
    };
  • 相关阅读:
    JavaScript——封装
    Vue.js——component(组件)
    MySQL数据库——安装教程(5.7版本)
    Vue.js——循环(Java、JSTL标签库、数据库)
    Vue.js——理解与创建使用
    JavaScript——闭包
    自定义最小索引优先队列
    自定义最大索引优先队列
    自定义最小优先队列
    自定义最大优先队列
  • 原文地址:https://www.cnblogs.com/yaoyudadudu/p/9219433.html
Copyright © 2011-2022 走看看