剑指offer之面试题37 两个链表的第一个公共结点

提交网址: http://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?tpId=13&tqId=11189

leetcode 160: https://leetcode.com/problems/intersection-of-two-linked-lists/

参与人数:3252   时间限制:1秒   空间限制:32768K

本题知识点: 链表 时间空间效率的平衡

题目描述

输入两个链表,找出它们的第一个公共结点。

分析:

方法1:

使用两个辅助栈,从尾部往头部找最后一个共同节点。但这种方法空间复杂度较高,时间复杂度为O(m+n)。

方法2:

先分别遍历两个链表,取各自的长度。较长的链表中的头指针一直往后面走,直到遇到相同节点。时间复杂度为O(m+n)。

#include <iostream>
using namespace std; struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
}; class Solution {
public:
int getLen(ListNode *head)
{
int count=0;
ListNode *p=head;
while(p != NULL)
{
count++;
p=p->next;
}
return count;
} ListNode* FindFirstCommonNode(ListNode *pHead1, ListNode *pHead2) {
if(pHead1==NULL || pHead2==NULL) return NULL;
int len1=getLen(pHead1);
int len2=getLen(pHead2); if(len1 >= len2)
{
int gap=len1-len2;
while(gap--) pHead1=pHead1->next;
}
else {
int gap=len2-len1;
while(gap--) pHead2=pHead2->next;
}
while(pHead1 != pHead2)
{
pHead1=pHead1->next;
pHead2=pHead2->next;
}
return pHead1;
}
}; // 以下为测试部分
int main()
{
ListNode *pA=new ListNode(1);
ListNode *p1=new ListNode(2);
ListNode *p2=new ListNode(3);
ListNode *pB=new ListNode(4);
ListNode *p3=new ListNode(5);
ListNode *p4=new ListNode(6);
ListNode *p5=new ListNode(7); pA->next=p1;
p1->next=p2;
p2->next=p4;
pB->next=p3;
p3->next=p4;
p4->next=p5;
p5->next=NULL; Solution sol; ListNode *pOut=sol.FindFirstCommonNode(pA,pB); cout<<pOut->val<<endl;
return 0;
}

LeetCode 160 Intersection of Two Linked Lists

Write a program to find the node at which the intersection of two singly linked lists begins.

For example, the following two linked lists:

A:          a1 → a2

c1 → c2 → c3

B: b1 → b2 → b3

begin to intersect at node c1.

Notes:

    • If the two linked lists have no intersection at all, return null.
    • The linked lists must retain their original structure after the function returns.
    • You may assume there are no cycles anywhere in the entire linked structure.
    • Your code should preferably run in O(n) time and use only O(1) memory.

#include <iostream>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
public:
int getLen(ListNode *head)
{
int count=0;
ListNode *p=head;
while(p != NULL)
{
count++;
p=p->next;
}
return count;
}
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { if(headA==NULL || headB==NULL) return NULL;
int len1=getLen(headA);
int len2=getLen(headB); if(len1 >= len2)
{
int gap=len1-len2;
while(gap--) headA=headA->next;
}
else {
int gap=len2-len1;
while(gap--) headB=headB->next;
}
while(headA != headB)
{
headA=headA->next;
headB=headB->next;
}
return headA;
}
}; // 以下为测试部分
int main()
{
ListNode *pA=new ListNode(1);
ListNode *p1=new ListNode(2);
ListNode *p2=new ListNode(3);
ListNode *pB=new ListNode(4);
ListNode *p3=new ListNode(5);
ListNode *p4=new ListNode(6);
ListNode *p5=new ListNode(7);
pA->next=p1;
p1->next=p2;
p2->next=p4;
pB->next=p3;
p3->next=p4;
p4->next=p5;
p5->next=NULL;
Solution sol;
ListNode *pOut=sol.getIntersectionNode(pA,pB);
cout<<pOut->val<<endl;
return 0;
}

C++版 - 剑指offer之面试题37:两个链表的第一个公共结点[LeetCode 160] 解题报告的更多相关文章

  1. 剑指Offer - 九度1505 - 两个链表的第一个公共结点

    剑指Offer - 九度1505 - 两个链表的第一个公共结点2013-11-24 20:09 题目描述: 输入两个链表,找出它们的第一个公共结点. 输入: 输入可能包含多个测试样例.对于每个测试案例 ...

  2. 剑指offer 面试题52. 两个链表的第一个公共节点

    这题之前leetcode做过,权当复习 首先这题没说是否一定有公共节点,如果代码可能因为这一点造成死循环的,需要提前验证所给两个链表是否有公共节点. 方法1:对于每一个list1的节点,遍历list2 ...

  3. 【剑指Offer】36、两个链表的第一个公共结点

      题目描述:   输入两个链表,找出它们的第一个公共结点.   解题思路:   本题首先可以很直观的想到蛮力法,即对链表1(假设长度为m)的每一个结点,遍历链表2(假设长度为n),找有没有与其相同的 ...

  4. 【剑指offer】面试题 52. 两个链表的第一个公共结点

    面试题 52. 两个链表的第一个公共结点 NowCoder 题目描述 输入两个链表,找出它们的第一个公共结点. Java 实现 ListNode Class class ListNode { int ...

  5. 【Offer】[52] 【两个链表的第一个公共结点】

    题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 输入两个链表,找出它们的第一个公共结点.下图中6为公共结点:  牛客网刷题地址 思路分析 如果两个链表有公共节点,那么公共节点出现在两 ...

  6. C++版 - 剑指offer 面试题16:反转链表(Leetcode 206: Reverse Linked List) 题解

    面试题16:反转链表 提交网址: http://www.nowcoder.com/practice/75e878df47f24fdc9dc3e400ec6058ca?tpId=13&tqId= ...

  7. 剑指Offer(三十六):两个链表的第一个公共结点

    剑指Offer(三十六):两个链表的第一个公共结点 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.ne ...

  8. 【剑指Offer面试编程题】题目1505:两个链表的第一个公共结点--九度OJ

    题目描述: 输入两个链表,找出它们的第一个公共结点. 输入: 输入可能包含多个测试样例. 对于每个测试案例,输入的第一行为两个整数m和n(1<=m,n<=1000):代表将要输入的两个链表 ...

  9. 《剑指offer》第五十二题(两个链表的第一个公共结点)

    // 面试题52:两个链表的第一个公共结点 // 题目:输入两个链表,找出它们的第一个公共结点. #include <iostream> #include "List.h&quo ...

随机推荐

  1. [Union]C++中Union学习笔记

    C++ union结构式一种特殊的类.它能够包含访问权限.成员变量.成员函数(可以包含构造函数和析构函数).它不能包含虚函数和静态数据变量.它也不能被用作其他类的基类,它本身也不能有从某个基类派生而来 ...

  2. 【web安全】-- springboot实现两次MD5加密

    一.为什么要做两次MD5 客户端MD5:HTTP在网络上是使用明文传输,用户输入的明文密码直接在网络上传输太危险.所以,在客户端先进行一次MD5(明文+固定盐). 服务端:服务端接受到后,也不是直接写 ...

  3. kvm虚拟机存储管理

    一.kvm存储虚拟化介绍: 1.KVM 的存储虚拟化是通过存储池(Storage Pool)和卷Volume)来管理的. 2.Storage Pool 是宿主机上可以看到的一片存储空间,可以是多种型 ...

  4. windows下cmd命令行上传代码到github的指定库

    https://blog.csdn.net/a419419/article/details/80063010 git错误:unable to auto-detect email address 解决办 ...

  5. 05解决flask循环引用的问题

    1, 什么是循环引用问题?为什么会导致循环引用? 1.1先讲是什么? 主文件中class类过多会导致主文件冗余,如下图,所以我们单独给class类一个文件,然后再引用它. 1.2再讲为什么? 主文件为 ...

  6. slitaz的root密码

    可以先试试root(我这个版本就是),如果不行passwd改密码吧...

  7. Linux进阶命令用法

    1.tr命令 可以对来自标准输入的字符进行替换.压缩和删除.它可以将一组字符变成另一组字符 选项 -c或——complerment:取代所有不属于第一字符集的字符: -d或——delete:删除所有属 ...

  8. 浅谈C++ STL

    C++ STL(标准模板库)是一套功能强大的 C++ 模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量.链表.队列.栈. C++ 标准模板库的核心包括以 ...

  9. Go语言基础之结构体

    Go语言基础之结构体 Go语言中没有“类”的概念,也不支持“类”的继承等面向对象的概念.Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性. 类型别名和自定义类型 自定义类型 在G ...

  10. 大数据核心知识点:Hbase、Spark、Hive、MapReduce概念理解,特点及机制

    今天,上海尚学堂大数据培训班毕业的一位学生去参加易普软件公司面试,应聘的职位是大数据开发.面试官问了他10个问题,主要集中在Hbase.Spark.Hive和MapReduce上,基础概念.特点.应用 ...