【leetcode刷题】[简单]160. 相交链表(intersection of two linked lists)-java

相交链表 linked list cycle

  • 题目
  • 分析
  • 解答

题目

编写一个程序,找到两个单链表相交的起始节点。

例如,下面的两个链表:

A:          a1 → a2
                   ↘
                     c1 → c2 → c3
                   ↗            
B:     b1 → b2 → b3

在节点 c1 开始相交。

注意:

  • 如果两个链表没有交点,返回 null.
  • 在返回结果后,两个链表仍须保持原有的结构。
  • 可假定整个链表结构中没有循环。
  • 程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。

代码模板:

/**
 * 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) {
        
    }
}

分析

先分别求出两个链表长度,然后把长的链表next到和短的一样的长度。这样的话,就能一起并进,然后找到某一个相等的就是相交链表

解答

/**
 * 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 currentA = headA;
        ListNode currentB = headB;
        int lenA = 0;
        int lenB = 0;
        while(currentA != null){
            currentA = currentA.next;
            lenA++;
        }
        while(currentB != null){
            currentB = currentB.next;
            lenB++;
        }
        ListNode currA = headA;
        ListNode currB = headB;
        while(lenA > lenB){
            currA = currA.next;
            lenA--;
        }
        while(lenA < lenB){
            currB = currB.next;
            lenB --;
        }
        while(currA != null){
            if(currA == currB){
                return currA;
            }
            currA = currA.next;
            currB = currB.next;
        }
        return null;
    }
}

你可能感兴趣的:(算法,leetcode)