首页 > 代码库 > Leetcode:Intersection of Two Linked Lists
Leetcode:Intersection of Two Linked Lists
题目链接:https://oj.leetcode.com/problems/intersection-of-two-linked-lists/
分析:题目就是求两个链表的的第一个交点,如果没有交点,那么返回NULL。所谓两个链表有交点,那么两个链表的形状一定是"Y"的形状,不可能是"X"形状。
算法一:暴力遍历(时间复杂度O(m*n),空间复杂度O(1))
对于链表A中的每一个节点ai,遍历整个链表B检测节点ai是否在B中。
算法二:哈希表(O(m+n)时间复杂度,空间复杂度O(n)或者O(m))
遍历链表A然后将A中的每个节点ai的地址放在hash表中,然后遍历链表B中的每一个节点bi,如果bi出现在hash表中,那么bi一定是交点。
算法三:两个指针(O(m+n)时间复杂度,空间复杂度O(1))
首先计算两个链表的长度,记为la、lb,然后让较长的那个链表的表头指针走abs(la-lb)次,那么两个表的表头指针距离链表尾部长度一定一样,然后两个链表一起走,即可判断。
AC代码:
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: int getListLen(ListNode *head) { if(head == NULL) { return 0; } int cnt = 0; while(head!=NULL) { cnt++; head = head->next; } return cnt; } ListNode * getIntersectionNode(ListNode *headA,ListNode *headB) { if( headA == NULL || headB == NULL ) return NULL; int la = 0,lb = 0; la = getListLen(headA); lb = getListLen(headB); int dis = la > lb ? la - lb : lb - la; if(la>lb) { while(dis--) { headA = headA -> next; } } else { while(dis--) { headB = headB -> next; } } while(headA!=headB) { headA = headA->next;headB = headB->next; } return headA; } };
整体测试代码:
#include<iostream> #include<cmath> using namespace std; struct ListNode { int val; ListNode *next; ListNode(int x) : val(x),next(NULL) {} }; class Solution { public: Solution(ListNode *&ha,ListNode *&hb,int a[],int la,int b[],int lb) { ha = new ListNode(a[0]); ListNode *p = ha; ListNode *inter; for(int i=1;i<la;i++) { ListNode *tmp = new ListNode(a[i]); if(i==3) inter = p; p->next = tmp; p=p->next; } hb = new ListNode(b[0]); p = hb; for(int i=1;i<lb;i++) { ListNode *tmp = new ListNode(b[i]); p->next = tmp; p = p->next; } ListNode *tail = p; tail->next = inter; } void print(ListNode *ha,ListNode *hb) { cout<<"a:"; while(ha!=NULL) { cout<<ha->val<<" "; ha = ha->next; } cout<<endl; cout<<"b:"; while(hb!=NULL) { cout<<hb->val<<" "; hb = hb->next; } cout<<endl; } int getListLen(ListNode *head) { if(head == NULL) { return 0; } int cnt = 0; while(head!=NULL) { cnt++; head = head->next; } return cnt; } ListNode * getIntersectionNode(ListNode *headA,ListNode *headB) { if( headA == NULL || headB == NULL ) return NULL; int la = 0,lb = 0; la = getListLen(headA); lb = getListLen(headB); int dis = la > lb ? la - lb : lb - la; if(la>lb) { while(dis--) { headA = headA -> next; } } else { while(dis--) { headB = headB -> next; } } while(headA!=headB) { headA = headA->next;headB = headB->next; } return headA; } }; int main() { int a[] = {1,3,5,6,7,8}; int b[] = {0,2,4}; ListNode *ha,*hb; Solution s( ha,hb,a,sizeof(a)/sizeof(a[0]),b,sizeof(b)/sizeof(b[0]) ); s.print(ha,hb); ListNode *res = s.getIntersectionNode(ha,hb); cout<<res->val<<endl; return 0; }
Leetcode:Intersection of Two Linked Lists
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。