首页 > 其他分享 >两个链表的第一个公共结点

两个链表的第一个公共结点

时间:2023-04-28 14:56:50浏览次数:32  
标签:结点 ListNode int auto next 链表 headB headA 公共

使用空间存储节点的解法

class Solution {
public:
    set<ListNode*> s;
    ListNode *findFirstCommonNode(ListNode *headA, ListNode *headB) {
        for (auto i = headA; i ; i=i->next)
            s.insert(i);
        for (auto i = headB; i ; i=i->next)
            if(s.count(i))  return i;
        return NULL;
    }
};

不使用空间,解法一

如果有公共结点肯定是在后面重叠,且后面部分都是共同的。

  • 先计算出两个链表的长度,可以让比较长的先走两个链表长度之差的步数,两个再一起走。
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *findFirstCommonNode(ListNode *headA, ListNode *headB) {
        int len1=0,len2=0;
        auto i=headA,j=headB;
        for (auto i = headA; i ; i=i->next) len1++;
        for (auto i = headB; i ; i=i->next) len2++;
        if(len1<len2)
        {
            swap(len1,len2);
            swap(i,j);
        }
        int offset=len1-len2;
        for (int t = 0; t < offset; t ++ )  i=i->next;
        while(i)
        {
            if(i==j)    return i;
            i=i->next;
            j=j->next;
        }
        return NULL;
    }
};

标签:结点,ListNode,int,auto,next,链表,headB,headA,公共
From: https://www.cnblogs.com/tangxibomb/p/17362206.html

相关文章

  • 【LeetCode动态规划#14】子序列系列题(最长递增子序列、最长连续递增序列、最长重复子
    最长递增子序列力扣题目链接(opensnewwindow)给你一个整数数组nums,找到其中最长严格递增子序列的长度。子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7]是数组[0,3,1,6,2,2,7]的子序列。示例1:输入:nums=[10,9,2,5,3,7......
  • 实现二叉树结点的新建、查找、修改
     如果需要新建结点(例如往二叉树里面插入结点时,可使用下面的函数(返回类型是一个指向node的指针)node*newNode(intv){nodeNode=newnode;//申请一个node类型变量的地址空间Node->data=v;//结点权值为vNode->lchild=Node->rchild=NULL;//初始状态下无左右孩子retur......
  • 环形链表
    题目:给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 思路:1、判断是否有环定义两个指针,一快一慢,从头指针开始遍历,快指针不为空或者快指针的下一个结点不为空,则有环2、返回环的位置 找到快、慢指针相遇的点,根据公式x=(n-1)(z+y......
  • [leetcode]复制带随机指针的链表
    力扣链接思路一:遍历链表,将链表结点复制下来,控制随机指针,去找对应的第几个(相对位置)进行链接.思路二:以时间换空间,创建两个指针数组,分别存放两个链表中结点的地址,直接可以在指针数组中找到结点该方法比上面的方法更优,但是时间复杂度依旧很高,但是还是达不到O(N)思路三:1.拷......
  • 合并两个有序链表--Python实现
    将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。#Definitionforsingly-linkedlist.#classListNode:#def__init__(self,x):#self.val=x#self.next=NoneclassSolution:defmergeT......
  • 链表相交
     题目:给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 需要注意的点:1、定义的两个指针在遍历完链表的长度后,要重新指向头结点2、让长、短链表的尾端对齐3、相交意味着指针相同 classSolution{p......
  • 删除链表的倒数第N个节点
    题目:给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。输入:head=[1,2,3,4,5],n=2输出:[1,2,3,5]本题需要使用双指针,需要注意的点:1、双指针都指向头结点2、快指针提前移动n+1个点3、结束条件:快指针指向空指针4、慢指针指向要删除结点的前一个结点5、删除结点时......
  • 循环控制:链表和数组
    循环是常用的流程环节。1//链表控制2//链表控制的优点,是通过指针来定位,那么循环的过程中,即是可变的,实时性很强。3vartmp*datastruct.ListNode4tmp=&datastruct.ListNode{Val:-1,Next:nil}56i:=07fornode:=tmp;node!=......
  • 两两交换链表中的结点
    题目:给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)  步骤: classSolution{public:ListNode*swapPairs(ListNode*head){ListNode*dummyHead=newListNode(0);//......
  • 23-4-25--链表--一元多项式求导
    设计函数求一元多项式的导数。输入格式:以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。输出格式:以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。输入样例:34-5261-20 ......