• Leetcode 160. 相交链表


    问题描述

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

    如下面的两个链表:

    注意点:实例一中相交的节点是8而不是1。这里可以这样理解两个链表相交的节点是指节点本身相同,而不单单是节点的值同,还要地址相同。相交点是出题者自己定义的,实例一的intersectval是 8 说明出题者定义的两个链表中的 1 在内存中的地址是不一样的,说明这两个节点不是同一个节点 虽然数据域 的数据一样。

     代码

    方法一、暴力法

     1 class Solution {
     2 public:
     3     ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
     4         ListNode *qA = headA;ListNode *qB_test = headB;
     5         while(qA != NULL ){
     6 
     7             while(qB_test != NULL ){
     8                 if(qA == qB_test) 
     9                     return qA;
    10                 qB_test = qB_test->next;
    11             }
    12             qB_test = headB;
    13             qA = qA->next; 
    14         }
    15         return NULL;
    16     }
    17 };

    无论何时不能忘记暴力,就是循环搜索。时间复杂度O(mn),即两个链表长度乘积。空间复杂度O(1)

    方法二、类似环中追击问题(双指针法)

     上图详见 https://leetcode-cn.com/problems/intersection-of-two-linked-lists/solution/jiao-ni-yong-lang-man-de-fang-shi-zhao-dao-liang-2/

     1 class Solution {
     2 public:
     3     ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
     4         if(headA == NULL || headB == NULL) return NULL;
     5         auto pA = headA ; auto pB = headB;
     6         while(pA != pB) {
     7             pA = pA == NULL ? headB : pA->next;
     8             pB = pB == NULL ? headA : pB->next;
     9         }
    10         return pA ;
    11     }
    12 };

    关于while循环,如果长度相同,且没有交点,在循环到第一轮末尾时,pA和pB会同时为null,这时就相等退出了。如果长度不同,没有交点,会在第二轮末尾同时为null,相等退出。

  • 相关阅读:
    Confluence 6 删除垃圾内容
    Confluence 6 在 Apache 或者系统级别阻止垃圾
    Confluence 6 避免和清理垃圾
    Confluence 6 配置 简易信息聚合(RSS)
    Confluence 6 匿名访问远程 API
    Confluence 6 使用电子邮件可见
    Confluence 6 配置 XSRF 保护
    Confluence 6 为登录失败编辑,禁用和配置验证码
    Confluence 6 为登录失败配置使用验证码
    Confluence 6 为搜索引擎隐藏外部链接
  • 原文地址:https://www.cnblogs.com/fresh-coder/p/13246550.html
Copyright © 2020-2023  润新知