Leetcode-Intersection of Two Linked Lists

LiBlog發表於2014-11-29

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.

Solution:

 1 /**
 2  * Definition for singly-linked list.
 3  * public class ListNode {
 4  *     int val;
 5  *     ListNode next;
 6  *     ListNode(int x) {
 7  *         val = x;
 8  *         next = null;
 9  *     }
10  * }
11  */
12 public class Solution {
13     public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
14         if (headA==null || headB==null) return null;
15 
16         ListNode s1 = headA;
17         ListNode s2 = headB;
18         int len1 = 1;
19         while (s1.next!=null){
20             len1++;
21             s1 = s1.next;
22         }
23         int len2 = 1;
24         while (s2.next!=null){
25             len2++;
26             s2=s2.next;
27         }
28         s1 = headA;
29         s2 = headB;
30         if (len1>len2){
31             while (len1>len2){
32                 s1 = s1.next;
33                 len1--;
34             }
35         } else if (len1<len2){
36             while (len1<len2){
37                 s2 = s2.next;
38                 len2--;
39             }
40         }
41 
42         while (s1!=null && s2!=null){
43             if (s1==s2)
44                 return s1;
45             s1 = s1.next;
46             s2 = s2.next;
47         }
48 
49         return null;
50     }
51 }

 

相關文章