首页 > 其他分享 >力扣面试题 02.07. 链表相交

力扣面试题 02.07. 链表相交

时间:2024-06-12 09:58:28浏览次数:21  
标签:力扣 面试题 遍历 ListNode head2 head1 next 链表

一 题目:

二 思路:

本题介绍两种思路解题,个人推荐思路一快速好理解
 思路一:
 1.先把其中一个链表的值变成负数
 2.遍历另一个链表第一个出现负数的值就是交点
 3.还原被改的链表
 思路二:
1.先用第一个链表的头节点head1搜索指针q遍历第一个链表直到为空,再把q放到head2上继续遍历
 2.用第二个链表的头节点head2搜索指针p遍历第一个链表直到为空,再把q放到head1上继续遍历
如果两个指针相等说明两个链表相交

三 代码:

#include <bits/stdc++.h>
using  namespace std;
/*
 * 思路一:
 * 1.先把其中一个链表的值变成负数
 * 2.遍历另一个链表第一个出现负数的值就是交点
 * 3.还原被改的链表
 */
typedef struct ListNode{
    int val;
    struct ListNode *next;
}ListNode;

ListNode *getIntersectionNode(ListNode *head1,ListNode *head2){

    ListNode *cur1=head1;//定义一个搜索指针
    //把第一个链表的值转化为负值
    while (cur1!=NULL){
        cur1->val=-(cur1->val);
        cur1=cur1->next;
    }
    ListNode *cur2=head2;
    ListNode *temp;//定义一个临时变量存储相交节点
    //遍历第二个链表找到第一个为负数的节点
    while(cur2!=NULL){
        if (cur2->val<0){
            temp=cur2;
            break;
        }
        cur2=cur2->next;
    }
    //还原链表
    cur1=head1;
    while (cur1!=NULL){
        cur1->val=-(cur1->val);
        cur1=cur1->next;
    }

    return temp;
}
/*
 * 思路二:
 * 1.先用第一个链表的头节点head1搜索指针q遍历第一个链表直到为空,再把q放到head2上继续遍历
 * 2.用第二个链表的头节点head2搜索指针p遍历第一个链表直到为空,再把q放到head1上继续遍历
 *  如果两个指针相等说明两个链表相交
 *  详解:
 *  其基本思想是使用两个指针 p 和 q 分别从 head1 和 head2 开始遍历,
 *  当其中一个指针到达链表末尾时,让它从另一个链表的头部重新开始遍历。
 *  这样,如果两个链表有相交节点,两个指针最终都会指向这个相交节点。
 *
 */

ListNode *getIntersectionNode2(ListNode *head1,ListNode *head2){
    ListNode *p=head1,*q=head2;
    while(p!=q){
        if(p!=NULL){
            p=p->next;
        }else{
            p=head2;
        }
        if(q!=NULL){
            q=q->next;
        }else{
            q=head1;
        }
    }
    return p;
}
int main() {
    // 创建第一个链表 1 -> 3 -> 5
    ListNode *head1 = (ListNode *)malloc(sizeof(ListNode));
    head1->val = 1;
    head1->next = (ListNode *)malloc(sizeof(ListNode));
    head1->next->val = 3;
    head1->next->next = (ListNode *)malloc(sizeof(ListNode));
    head1->next->next->val = 5;
    head1->next->next->next = nullptr;

    // 创建第二个链表 2 -> 4 -> 6 -> 3 -> 5
    ListNode *head2 = (ListNode *)malloc(sizeof(ListNode));
    head2->val = 2;
    head2->next = (ListNode *)malloc(sizeof(ListNode));
    head2->next->val = 4;
    head2->next->next = head1->next; // 交点,共享head1链表的3和5
    head2->next->next->next = head1->next->next;
    head2->next->next->next->next = nullptr;

    // 寻找并打印相交节点
//    ListNode *intersection = getIntersectionNode(head1, head2);
    ListNode *intersection = getIntersectionNode2(head1, head2);
    if (intersection != nullptr) {
        cout << intersection->val << endl;
    } else {
        cout << "-1" << endl;
    }

    // 释放链表占用的内存
    ListNode *temp;
    while (head1 != nullptr) {
        temp = head1;
        head1 = head1->next;
        free(temp);
    }
    while (head2 != nullptr) {
        temp = head2;
        head2 = head2->next;
        free(temp);
    }

    return 0;
}

四 小结

定义:两个不同的链表在某一点相交,即它们共享相同的节点。

特点

  • 可能完全没有相交,或者从某个节点开始完全相同。
  • 相交点之后,两个链表的节点完全一致。

解题技巧

  1. 双指针法:两个指针分别从两个链表的头部开始遍历,当一个指针到达尾部时,从另一个链表的头部继续遍历。如果相交,两个指针最终会相遇。
  2. 哈希表法:遍历其中一个链表,将节点地址存储在哈希表中,然后遍历第二个链表,检查节点是否已存在于哈希表中。

标签:力扣,面试题,遍历,ListNode,head2,head1,next,链表
From: https://blog.csdn.net/qq_59569832/article/details/139575233

相关文章

  • 前端面试题日常练-day63 【面试题】
    题目希望这些选择题能够帮助您进行前端面试的准备,答案在文末1.TypeScript中,以下哪个关键字用于声明一个类的构造函数?a)constructorb)initc)created)initialize2.在TypeScript中,以下哪个符号用于声明可选的函数参数?a)?b)!c)*d)~3.TypeScript中的命名......
  • java面试题: HashMap、HashSet 和 HashTable 的区别
     HashMap常用方法 HashMap是一个基于哈希表的Map接口的实现。它允许使用null值和null键。 java复制//创建一个HashMapHashMap<KeyType,ValueType>map=newHashMap<>(); //添加元素map.put(key,value); //获取元素ValueTypevalue=map.get......
  • 路径总和-力扣
    本题想到的解法是对二叉树进行深度搜索,并记录路径和,当节点为叶子节点时,将路径和与目标值进行判断,如果相等则返回true,否则返回false,最后返回左右子树或的值即可,因为只需有一条满足条件就可以。/***Definitionforabinarytreenode.*structTreeNode{*intv......
  • 左叶子之和-力扣
    本题计算二叉树的左叶子之和,使用后序遍历的顺序对二叉树进行深度搜索,关键点在于,对左叶子节点的值的操作上,需要在左叶子节点的父节点进行。/***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNode*left;*TreeNode*right......
  • 整理好了!2024年最常见 20 道分布式、微服务面试题(十)
    上一篇地址:整理好了!2024年最常见20道分布式、微服务面试题(九)-CSDN博客十九、如何设计一个高可用的分布式系统?设计一个高可用的分布式系统是一个复杂的过程,需要考虑多个方面以确保系统的鲁棒性、可扩展性和容错性。以下是一些关键的设计原则和实践:1. 冗余设计:数据冗余:通......
  • 整理好了!2024年最常见 20 道分布式、微服务面试题(九)
    上一篇地址:整理好了!2024年最常见20道分布式、微服务面试题(八)-CSDN博客十七、什么是断路器模式,它如何解决服务依赖问题?断路器模式(CircuitBreakerPattern)是一种软件设计模式,用于处理分布式系统中的服务依赖问题。当一个服务由于某些原因变得不稳定或不可用时,断路器模式可以......
  • 持续总结中!2024年面试必问 20 道分布式、微服务面试题(九)
    上一篇地址:持续总结中!2024年面试必问20道分布式、微服务面试题(八)-CSDN博客十七、什么是配置管理在微服务架构中的重要性?在微服务架构中,配置管理是确保系统灵活性、可维护性和可扩展性的关键组成部分。以下是配置管理在微服务架构中的重要性:1. 环境一致性:微服务架构通常......
  • Java 开发面试题精选:Mysql 一篇全搞定
    前言在高级Java开发工程师的面试中,MySQL作为常见的数据库技术,其掌握程度往往是评估候选人综合能力的重要组成部分。在这篇文章中,我精选了一些最可能被问到的与MySQL相关的面试题目,这些题目可以全面考察候选人的理论知识、实战经验和问题解决能力,不管你是准备求职的小伙伴,还是......
  • 【OJ】链表的按顺序排序
    题目描述~~~将带有头结点的单向链表结点中的数据从小到大排序。输入描述第一行输入链表长度;第二行输入链表结点中的数据。输出描述排序后的链表(输出头结点,用“Head”表示)用例输入160104286用例输出1Head->0->2->4->6->8->10code:#include<stdio.h>......
  • Redis面试题、知识点总结,一篇文章让Redis成为面试加分项
    Redis面试题、知识点总结,一篇文章让Redis成为面试加分项前言参与了几次中大厂的面试,你会发现一面时对于八股文的考察也具有侧重点(MySQL=Redis>网络>系统>设计模式>java集合>JVM>spring)本文的目标就是通过这一篇文章让你能在面试时将Redis相关的问题回答漂亮。......