LeetCode 中级 - 相交链表

相交链表

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

例如,下面的两个链表:

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) {
            if(headA == null || headB ==null){
                return null;
            }
            ListNode tempA = headA;
            ListNode tempB = headB;
            ListNode endNode = null;
            int lenA = 0,lenB = 0;
            while(tempA!=null){
                lenA++;
                tempA = tempA.next;
            }
            while(tempB!=null){
                lenB++;
                tempB = tempB.next;
            }
            for(tempA = headA,tempB = headB;lenA>0&&lenB>0;){
                if(tempA == tempB){
                    return tempA;
                }
                if(lenA>lenB){
                    tempA = tempA.next;
                    lenA--;
                }else if(lenA < lenB){
                    tempB = tempB.next;
                    lenB--;
                }else {
                    tempA = tempA.next;
                    tempB = tempB.next;
                    lenA --;
                    lenB --;
                }
            }
            return null;
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值