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

    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.

    可以将A,B两个链表看做两部分,交叉前与交叉后。

    交叉后的长度是一样的,因此交叉前的长度差即为总长度差。

    只要去除这些长度差,距离交叉点就等距了。

    为了节省计算,在计算链表长度的时候,顺便比较一下两个链表的尾节点是否一样,

    若不一样,则不可能相交,直接可以返回NULL

    /**
     * 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 == NULL || headB == NULL)
                return NULL;
            ListNode* iter1 = headA;
            ListNode* iter2 = headB;
            int len1 = 1;
            while(iter1->next != NULL)
            {
                iter1 = iter1->next;
                len1 ++;
            }
            int len2 = 1;
            while(iter2->next != NULL)
            {
                iter2 = iter2->next;
                len2 ++;
            }
            if(iter1 != iter2)
                return NULL;
            if(len1 > len2)
            {
                for(int i = 0; i < len1-len2; i ++)
                    headA = headA->next;
            }
            else if(len2 > len1)
            {
                for(int i = 0; i < len2-len1; i ++)
                    headB = headB->next;
            }
            while(headA != headB)
            {
                headA = headA->next;
                headB = headB->next;
            }
            return headA;
        }
    };

  • 相关阅读:
    UIStoryBoard 中修改控件borderColor
    iOS自定义AlertView 与 ActionSheet 遮罩提示+弹出动画
    iOS开发 UIWebView+JavaScript 交互总结
    【注入攻击】SQL注入(不完整总结)
    [内存溢出]栈溢出基础版
    [Windows驱动开发]之内存管理
    [找工作]程序员面试宝典【笔记】(part 1)
    [Windows安装]安装程序无法创建新的系统分区,也无法定位现有系统分区
    M1卡分析
    [逆向/壳]脱壳方法
  • 原文地址:https://www.cnblogs.com/ganganloveu/p/4128905.html
Copyright © 2011-2022 走看看