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

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

    例如,下面的两个链表

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

    在节点 c1 开始相交。

    注意:

    • 如果两个链表没有交点,返回 null.
    • 在返回结果后,两个链表仍须保持原有的结构。
    • 可假定整个链表结构中没有循环。
    • 程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。
    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    //           用大A表示ListA里面非共有 Bb表示listB里面非共有的,可以看到在第二个intersection的开头两个链表长度是一样的,必然相等
    //           所以我们可以遍历A再遍历B,另一个遍历B再遍历A,两个指针必定在第二个交集处相遇,没有交集就是空指针
    public:
        ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
            ListNode *cursorA = headA;
            ListNode *cursorB = headB;
            if(!cursorA || !cursorB)
                return NULL;
            while(cursorA != cursorB){
                if(!cursorA)
                    cursorA = headB;
                else
                    cursorA = cursorA->next;
                if(!cursorB)
                    cursorB = headA;
                else
                    cursorB = cursorB->next;
            }
            return cursorA;
        }
    };
    /**
     * 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) {
            ListNode *a = headA;
            ListNode *b = headB;
            int n = 0, m = 0;
            if(a == NULL || b == NULL) return NULL;
            while(a->next != NULL){
                a = a->next;
                n++;
            }
            while(b->next != NULL){
                b = b->next;
                m++;
            }
            if(a != b) return NULL;
            a = headA;
            b = headB;
            if(n > m){
                swap(n,m);
                swap(a,b);
            }
            int i = 0;
            while(b != NULL&&n + i != m){
                b = b->next;
                i++;
            }
            while(a != NULL && b != NULL){
                if(a == b)
                    return a;
                a = a->next;
                b = b->next;
            }
        }
    };
  • 相关阅读:
    傻瓜教程:asp.net(c#) 如何配置authentication,完成基于表单的身份验证
    ajax与php交互的get和post两种实现方式
    php 存储过程
    一万小时天才理论
    servlet阅读
    post and get
    合并两个有序数组(重新开始)
    Java参数传递问题
    一万小时(如何实现)阅读
    java IO 流的学习(我们到底能走多远系列1)
  • 原文地址:https://www.cnblogs.com/strawqqhat/p/10602313.html
Copyright © 2011-2022 走看看