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

 

posted @ 2015-07-06 15:54  tjuloading  阅读(122)  评论(0)    收藏  举报