【LeetCode从零单排】No.160 Intersection of Two Linked Lists

来源:互联网 发布:js视频教程 百度云 编辑:程序博客网 时间:2024/06/02 21:02

题目

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.


题目要求取两个链表的交点,而且时间复杂度必须是O(n),所以就不能用嵌套循环的方法。用了如下方法,先计算两个链表的各自长度,将长链表节点向下移动两链表长度差,再计算。


代码

/** * 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;              int Aindex_length=getLength(headA);        int Bindex_length=getLength(headB);        int dis=Math.abs(Aindex_length-Bindex_length);                                            ListNode Aindex=headA;        ListNode Bindex=headB;        if(Aindex_length>=Bindex_length){          for(int i=0;i<dis;i++){              Aindex=Aindex.next;          }            while(Bindex!=null){              if(Aindex.val==Bindex.val){return Aindex;}              else{                  Aindex=Aindex.next;                  Bindex=Bindex.next;                 }          }        }                Aindex=headA;         Bindex=headB;      if(Aindex_length<Bindex_length){          for(int i=0;i<dis;i++){              Bindex=Bindex.next;          }            while(Aindex!=null){              if(Aindex.val==Bindex.val){return Aindex;}              else{                  Aindex=Aindex.next;                  Bindex=Bindex.next;                 }          }        }                        return null;    }    public int getLength(ListNode head){        ListNode index=head;        int length=1;        while(index.next!=null){            index=index.next;            length++;        }        return length;    }}




代码下载:https://github.com/jimenbian/GarvinLeetCode

/********************************

* 本文来自博客  “李博Garvin“

* 转载请标明出处:http://blog.csdn.net/buptgshengod

******************************************/



0 0
原创粉丝点击