Intersection of Two Linked Lists (Java)

来源:互联网 发布:如何制作电脑软件 编辑:程序博客网 时间:2024/05/16 18:28

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.
如果存在intersection,那么A与B最后一定有一些值是一样的,只需截断较长的那条链表的前面abs(len(A),len(B))个元素,此时两个链表就一样长了,然后设一个指针同时往后遍历即可。
source
/** * 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) {        int l1 = 0, l2 = 0, value;    ListNode h1 = headA;    ListNode h2 = headB;        if(h1 == null || h2 == null) return null;     while(h1.next != null){//java中null要小写    l1++;    h1 = h1.next;    }    while(h2.next != null){    l2++;    h2 = h2.next;    }        h1 = headA;    h2 = headB;    value = Math.abs(l1 - l2);        if(l1 >= l2){     for(int i = 0; i < value;i++){    h1 = h1.next;    }        while(h1 != null && h1.val != h2.val){//特别注意h1走到尾部的情况,下一个元素未赋初值会抛出null异常    h1 = h1.next;    h2 = h2.next;        }        if(h1 == null) return null;    else return h1;        }    else{    for(int i = 0; i < value; i++){    h2 = h2.next;    }     while(h1 != null && h1.val != h2.val){  //写的有点复杂,可以和上面合起来    h1 = h1.next;    h2 = h2.next;        }    if(h1 == null) return null;    else return h1;    }    }}

Test
 public static void main(String[] args){    ListNode a = new ListNode(1);    a.next = new ListNode(2);    a.next.next = new ListNode(3);    a.next.next.next = new ListNode(4);    ListNode b = new ListNode(6);    b.next = new ListNode(7);    ListNode c = new Solution().getIntersectionNode(a, b);    if(c != null) System.out.print(c.val);    else System.out.print("null");    }


0 0