160. Intersection of Two Linked Lists

来源:互联网 发布:翻墙软件大全 编辑:程序博客网 时间:2024/06/03 22:42

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.

Subscribe to see which companies asked this question.


Java Code:

/** * 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) {        ListNode ha = headA;        ListNode hb = headB;        int la = 0;        int lb = 0;                while (ha != null || hb != null) {            if (ha != null) {                la++;                ha = ha.next;            }                        if (hb != null) {                lb++;                hb = hb.next;            }        }        ha = headA;        hb = headB;        if (la < lb) {            ha = headB;            hb = headA;            la = lb + la;            lb = la - lb;            la = la - lb;        }                int k = la - lb;        while (ha != null && hb != null && ha != hb) {            ha = ha.next;            if (--k < 0) {                hb = hb.next;            }        }                return ha == hb ? ha : null;    }}


0 0