首页 > 其他分享 >160链表相交

160链表相交

时间:2025-01-04 22:23:20浏览次数:1  
标签:ListNode nullptr 相交 链表 curB headB curA 160

哈希肯定是能解的,就想着有没有其他方法。最开始的思路是翻转链表,然后再来找相交结点,但是题目要求不能改链表结构。
官方题解的第二种方法确实巧妙,如果有相交结点的话最多通过两次遍历就一定能找到,因此。在分析中,其实我们也可以把两个不相交的链表看做相交,但是相交结点为nullptr
代码随想录上将两个链表尾部对齐,然后从短链表的位置开始,两个指针后移。这里由于是一旦出现相交则后续的结点都相同,因此这种方法是正确的。

//官方题解方法
class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        if(headA == nullptr || headB == nullptr)
        {
            return nullptr;
        }
        ListNode* curA = headA;
        ListNode* curB = headB;
       //实质是while( curA != curB && !(curA==nullptr&&curB==nullptr) ),但后面那个其实就是curA=curB
	   while(curA != curB)
        {
            if(curA == nullptr) 
                curA = headB;
            else
                curA = curA->next;
                
            if(curB == nullptr)
                curB = headA;
            else
                curB = curB->next;           
        }
        return curA;
    }
};
//代码随想录的解法
class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
       int lA=0, lB=0;
        ListNode* curA = headA;
        ListNode* curB = headB;
       while( curA != nullptr)
       {
        lA++;
        curA = curA->next;
       }
       while( curB != nullptr)
       {
        lB++;
        curB = curB->next;
       }

        curA = headA;
        curB = headB;
        // 确定让curA为最长链表的头,lA为其长度
        if (lB > lA) {
            swap (lA, lB);
            swap (curA, curB);
        }
        int gap = lA - lB;
        // 让curA和curB在同一起点上(末尾位置对齐)
        while (gap--) {
            curA = curA->next;
        }
        // 遍历curA 和 curB,遇到相同则直接返回
        while (curA != nullptr) {
            if (curA == curB) {
                return curA;
            }
            curA = curA->next;
            curB = curB->next;
        }
        return nullptr; 
    }
};

标签:ListNode,nullptr,相交,链表,curB,headB,curA,160
From: https://www.cnblogs.com/gqzz/p/18652574

相关文章

  • 《约瑟夫问题 循环链表》
    约瑟夫问题循环链表题解来了!!!#include<bits/stdc++.h>usingnamespacestd;intm,n;structNode{ intdata; Node*next;}*head,*p,*tail,*temp;intmain(){ cin>>m>>n; head=newNode; head->next=NULL; tail=head; for(inti=1;i&......
  • 19删除链表的倒数第n个结点
    正常思路,先遍历一遍链表得到长度,然后进行第二次遍历得到待删除结点的上一个结点classSolution{public:ListNode*removeNthFromEnd(ListNode*head,intn){ListNode*dummyHead=newListNode(0);dummyHead->next=head;ListNode*cur=......
  • 24. 两两交换链表中的节点(中)
    目录题目法一、迭代法二、递归题目给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。法一、迭代varswapPairs=function(head){letdummy={next:head}letp1=dummywhil......
  • 24 两两交换链表中的节点
    思路简单,但是操作的时候还是要注意细节,特别是某些结点的next指针变化需要格外关注,报了很多次错。因为没注意到:每次替换两个结点后,应该让当前的后面的结点指向下两个结点的靠后一点的结点。主要还是画完图后没有走一遍链表classSolution{public:ListNode*swapPairs(List......
  • 单链表的一些操作(c语言):插入头节点、尾节点、删除某个节点
    #include<stdio.h>#include<stdlib.h>structNode{  intdata;  structNode*Next;  /*data*/};typedefstructNodenode;node*Link;// 创建一个新的节点node*CreateNewNode(intdata){  node*NewNode=(node*)malloc(sizeof(node......
  • 数据结构:循环单链表
    循环单链表(CircularSinglyLinkedList)循环单链表是单链表的一种变体,其特点是链表的尾节点指向头节点,形成一个闭环。这种结构允许在链表中进行无缝的遍历,并且可以从任何节点开始遍历整个链表。循环单链表通常用于需要循环访问元素的场景,如轮询调度、环形缓冲区等。1.节点结......
  • 编程题-删除排序链表中的重复元素
    题目:给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回已排序的链表 。解题由于给定的链表是排好序的,因此重复的元素在链表中出现的位置是连续的,因此我们只需要对链表进行一次遍历,就可以删除重复的元素。本题较为简单,笔者不做过多解释,......
  • 开源商业化 Sealos 如何做到月入 160万
    去年我写了一篇也是讲开源商业化的文章,当时是月入30万,一年过去了,我们整整涨了5倍多。本文理论结合实践,比较干货,希望对大家有帮助。我们的现状,谁在给我们付钱第一,开发者,我们已经近20万用户了,而且随着SealosDevbox的发布,活跃用户和付费用户飙增,广受用户好评,且用户已经形......
  • Day3算法练习——链表篇
    反转链表用头插法即可解决,双指针就能实现原地头插法,板子题需要熟练还是要理一下,简单题不能卡两两交换链表中的节点加上虚拟头节点会好很多指针多了,模拟起来比较麻烦,建议画图删除链表的倒数第N个结点slow指向要删的结点之前而不是要删的结点,会简单不少理清楚n个结点......
  • 单链表的创建以及插入<上>
    1:此次学习参考的是b站up主【【一听就懂】C语言单链表(合集)!学完C语言还没学会写单链表吗?一节课教你有头单链表的全部知识!】https://www.bilibili.com/video/BV1Mm4y1V7Ww?vd_source=fa5bfcb2d5af224272cc17f6b40b10c3易错点2.1在 creatlist 和 creatNode 函数中,......