【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 };

 

你可能感兴趣的:(intersect)