剑指offer之面试题37:两个链表的第一个公共结点[LeetCode 160] 解题报告
来源:互联网 发布:linux网络编程 第2版 编辑:程序博客网 时间:2024/05/07 13:35
剑指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;}
2 0
- 剑指offer之面试题37:两个链表的第一个公共结点[LeetCode 160] 解题报告
- 剑指offer之面试题37两个链表的第一个公共结点
- 剑指Offer之面试题37:两个链表的第一个公共结点
- 【剑指offer】面试题37:两个链表的第一个公共结点
- [剑指offer]面试题37:两个链表的第一个公共结点
- 剑指Offer:面试题37 两个链表的第一个公共结点
- 剑指offer 面试题37 两个链表的第一个公共结点
- 《剑指Offer》学习笔记--面试题37:两个链表的第一个公共结点
- 【剑指Offer学习】【面试题37:两个链表的第一个公共结点】
- 剑指Offer面试题37(Java版):两个链表的第一个公共结点
- 剑指Offer----面试题37:两个链表的第一个公共结点
- 剑指offer--面试题37:两个链表的第一个公共结点
- 剑指Offer面试题37(Java版):两个链表的第一个公共结点
- 剑指offer-面试题37-两个链表的第一个公共结点
- 剑指Offer系列-面试题37:两个链表的第一个公共结点
- 剑指offer-面试题37-两个链表的第一个公共结点
- 剑指offer 面试题37 两个链表的第一个公共结点
- 【剑指offer】面试题37:两个链表的第一个公共结点
- source insight的使用
- AJAX入门 之 XMLHttpRequest对象的属性(一)
- 随记获取汉字
- ubuntu16.04安装 cuda7.5
- 移花接木-联想Ideapad Y570 USB2.0升级到USB3.0成功
- 剑指offer之面试题37:两个链表的第一个公共结点[LeetCode 160] 解题报告
- oracle回滚段
- Java基础总结
- xilinx fpga学习笔记1
- 深入了解JavaScriptCore(一)
- 正则表达式-中文姓名带·,英文名字加空格
- 2016年中总结、半年总结
- 记毕业一年,关于工作,关于感情
- Android 视频开发中如何通过url或者本地视频文件路径获得视频的第一帧图片