Intersection of Two Linked Lists

来源:互联网 发布:linux查看jdk安装路径 编辑:程序博客网 时间:2024/06/05 03:19

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.

Show Tags
Have you met this question in a real interview?

很简单的一道题,但是有不同的思路。 
1. bruce force O(mn) running time, O (1) space. 
2. HashSet  O(m + n ) running time, O(m) space.  
3. Count the list length and detect the first same node,  O(m + n) running time, O (1) space
4. Maintain 2 points, if one pointer get to the end, redirect to the other list. Then find the first common node. O(m + n) running time. O(1) space.

method 3: 
/** * Definition for singly-linked list. * public class ListNode { *     int val; *     ListNode next; *     ListNode(int x) { *         val = x; *         next = null; *     } * } */public class Solution {    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {        if(headA == null || headB == null)            return null;        ListNode curA = headA;        ListNode curB = headB;        int lenA = 1, lenB = 1;        while(curA.next != null){            curA = curA.next;            lenA++;        }        while(curB.next != null){            curB = curB.next;            lenB++;        }        if(curA != curB){            return null;        }        ListNode longList = (lenA > lenB) ? headA : headB;        ListNode shortList = (lenA > lenB) ? headB : headA;        int diff = Math.abs(lenA - lenB);        while(diff > 0){            longList = longList.next;            diff--;        }        while(longList != shortList){            longList = longList.next;            shortList = shortList.next;        }        return longList;    }}

method 4 : 

/** * Definition for singly-linked list. * public class ListNode { *     int val; *     ListNode next; *     ListNode(int x) { *         val = x; *         next = null; *     } * } */public class Solution {    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {        if(headA == null || headB == null)            return null;        ListNode curA = headA;        ListNode curB = headB;        ListNode lastA = null;        ListNode lastB = null;        while(curA != curB){            if(curA.next != null)                curA = curA.next;            else{                lastA = curA;                curA = headB;            }            if(curB.next != null)                curB = curB.next;            else{                lastB = curB;                curB = headA;            }            if(lastA != null && lastB != null && lastA != lastB)//---Detect  whether the last element same.                return null;        }        return curA;    }}


0 0
原创粉丝点击