
剑指offer Leetcode 52. 两个链表的第一个公共节点
发布日期:2021-05-06 23:39:30
浏览次数:15
分类:技术文章
本文共 1254 字,大约阅读时间需要 4 分钟。
我的解法:hashset(效率不高)
思想:
复杂度:
●时间:O(M + N),遍历两个链表
●空间:O(M + N),利用set存储
代码:
一开始我居然是用A放一个B放一个来做的,发现这样完全不可行,因为可能A到尾了,B还没到相交节点
class Solution { public: ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { if(headA == NULL || headB == NULL) return 0; unordered_setset_ListNode; //先把A放入set while(headA != NULL){ set_ListNode.insert(headA); headA = headA->next; } //在set中查找B的每一个节点,查到了就返回 while(headB != NULL){ if(set_ListNode.find(headB) != set_ListNode.end()) return headB; headB = headB->next; } return NULL; }};
解法2:双指针
思想:
两个链表长度分别为L1+C、L2+C, C为公共部分的长度,按照楼主的做法: 第一个人走了L1+C步后,回到第二个人起点走L2步;第2个人走了L2+C步后,回到第一个人起点走L1步。 当两个人走的步数都为L1+L2+C时就两个家伙就相遇了

复杂度:
●时间:O(M + N)
●空间:O(1)
代码:
class Solution { public: ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { //不用特判NULL,如果不相遇两人会同时走到末尾即NULL,结束循环,返回NULL ListNode *node1 = headA; ListNode *node2 = headB; while (node1 != node2) { node1 = node1 != NULL ? node1->next : headB; node2 = node2 != NULL ? node2->next : headA; } return node1; }};
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2025年03月24日 07时26分46秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
使用 top 命令了解 Fedora 的内存使用情况 | Linux 中国
2019-03-03
8皇后问题 递归 函数调用是重点
2019-03-03
1541 +1 *2 ²
2019-03-03
面试别慌!阿里专家带你从【入门+基础+进阶+项目】攻破SpringBoot
2019-03-03
【Java面试】30个 Java 集合面试必备的问题和答案
2019-03-03
华为鸿蒙到底是不是安卓系统套了个壳?
2019-03-03
fragment中recyclerview的重新加载问题
2019-03-03
window程序设计(1):第一个windows程序
2019-03-03
windows程序设计(4):文本输出
2019-03-03
21.2.3总结
2019-03-03
线性代数和数学期望杂题
2019-03-03
【SSL_P2876】2017年东莞市信息学特长生测试题 工程
2019-03-03
【洛谷_P1433】吃奶酪
2019-03-03
volatile关键字和AtomicInteger
2019-03-03
redisTemplate.opsForHash()
2019-03-03
maven生命周期
2019-03-03
方法的绑定机制-静态绑定和动态绑定
2019-03-03
setnx
2019-03-03