首页 > 代码库 > Intersection of Two Linked Lists
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.
Credits:
Special thanks to @stellari for adding this problem and creating all test cases.
1)把其中的一条链首尾相连,组成一个环,这样问题就转化成:判断一条链表是否有环,如果有,求环的入口问题。
2)把两个链表都首尾颠倒顺序,然后比较。比较完之后,再颠倒把链表的顺序,恢复原样。
算法1的代码:
c++
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { if(!headA||!headB) return NULL; ListNode *p = headB; while(p->next){ p=p->next; } ListNode *tailB = p; tailB->next=headB; ListNode *p1,*p2; p1=headA; p2=headA; while(p1){ p1=p1->next; p2=p2->next; if(p1){ p1=p1->next; }else{ tailB->next = NULL; return NULL; } if(p1==p2){ break; } } if(p1==NULL){ tailB->next = NULL; return NULL; } p2=headA; while(p1!=p2){ p2=p2->next; p1=p1->next; } tailB->next = NULL; return p2; } };
Intersection of Two Linked Lists
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。