【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.
题意:
给两个可能相交的链表,求出其交点位置。
思路:
1.将其中一条链表(B)的首位相连,问题转换为“求一个带环链表(A)的入环位置”。
2.从链表(A)起始处利用快慢指针(p1、p2)遍历环,得到快慢指针相等的结点(p1 == p2)的位置。
3.将p1指向链表(A)的起始处后,p1、p2同步走。
4.走至 p1 == p2 的位置处,即为所求结点。
ps:1.要判断可能不相交的情况 2.不能改动原本的数据结构(B的尾指针在返回前要置为0)
C++:
1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : val(x), next(NULL) {} 7 * }; 8 */ 9 class Solution { 10 public: 11 ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { 12 if(headA == 0 || headB == 0) 13 return 0; 14 15 ListNode *phb = headB; 16 while(phb->next != 0) 17 phb = phb->next; 18 phb->next = headB; 19 20 bool isloop = false; 21 ListNode *pha = headA; 22 while(pha != 0) 23 { 24 if(pha == headB) 25 { 26 isloop = true; 27 break; 28 } 29 pha = pha->next; 30 } 31 32 if(!isloop) 33 { 34 phb->next = 0; 35 return 0; 36 } 37 38 ListNode *p1 = headA->next; 39 ListNode *p2 = headA->next->next; 40 41 while(p1 != p2) 42 { 43 p1 = p1->next; 44 p2 = p2->next->next; 45 } 46 47 p1 = headA; 48 49 while(p1 != p2) 50 { 51 p1 = p1->next; 52 p2 = p2->next; 53 } 54 55 phb->next = 0; 56 return p1; 57 } 58 };