leetcode解题之160# Intersection of Two Linked Lists Java版 (两个链表的第一个公共结点)

来源:互联网 发布:大熊猫脾气 知乎 编辑:程序博客网 时间:2024/06/04 17:42

160. Intersection of Two Linked Lists

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, returnnull.
  • 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.

查找两个链表的第一个公共节点,如果两个节点的尾节点相同,肯定存在公共节点

方法: 长的链表开始多走 (h1的数量 - h2的数量)步,然后和短链表同步往下走,遇到的第一个相同的节点就是最早的公共节点

class ListNode {int val;ListNode next;ListNode(int x) {val = x;next = null;}}

public ListNode getIntersectionNode(ListNode headA, ListNode headB) {if (headA == null || headB == null)return null;ListNode h1 = headA;ListNode h2 = headB;// lenA为A链表的长度,初始值为1int lenA = 1;int lenB = 1;while (h1.next != null) {lenA++;h1 = h1.next;}while (h2.next != null) {lenB++;h2 = h2.next;}// 若A与B尾结点不同,则肯定没有相交。if (h1 != h2)return null;else {int count = Math.abs(lenA - lenB);//h1指向链表长的头结点。if (lenA >= lenB) {h1 = headA;h2 = headB;} else {h1 = headB;h2 = headA;}for(int i=0;i<count;i++)h1=h1.next;while(h1 != null&&h2 != null && h1 != h2){                  h1 = h1.next;                  h2 = h2.next;              }  }//若没有交点,则h1 为nullreturn h1;}



0 0
原创粉丝点击