剑指 offer 面试题 52 两个链表中的第一个节点(快慢指针)

两个链表中第一个公共节点

个人博客


fQMPq8

题解
  • 快慢指针

    • 算法思想
      • 先遍历一遍链表,分别记录链表的长度,记为 alength、blength
      • 让长的链表先走(abs(alength-blength))
      • 然后两个链表同时向后走,直到两个链表同时到达同一个节点
    • 复杂度分析
      • 时间复杂度O(m+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) {
            int alength = 0,blength = 0;
            ListNode a = headA,b = headB;
            while(a != null){
                alength++;
                a = a.next;
            }
            while(b != null){
                blength++;
                b = b.next;
            }
            if(alength > blength){
                for(int i = 0;i < alength - blength;i++){
                    headA = headA.next;
                }
            }else{
                for(int i = 0; i < blength - alength;i++){
                    headB = headB.next;
                }
            }
            while(headA != headB && headA != null && headB != null){
                headA = headA.next;
                headB = headB.next;
            }
            return headA ==null || headB == null ? null : headA;
        }
    }
    
  • 巧妙

    • 算法思想

      • 我们使用两个指针 node1,node2 分别指向两个链表 headA,headB 的头结点,然后同时分别逐结点遍历,当 node1 到达链表 headA 的末尾时,重新定位到链表 headB 的头结点;当 node2 到达链表 headB 的末尾时,重新定位到链表 headA 的头结点。这样,当它们相遇时,所指向的结点就是第一个公共结点。
      • 见下图(当a,b没有交点时,走 m+n 步之后都 为 null)
      • xYUSSF
    • 复杂度分析

      • 时间复杂度 O(n+m)
      • 空降复杂度 O(1)
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
    
            if (headA == null || headB == null) return null;
            ListNode node1 = headA, node2 = headB;
            while (node1 != node2) {
                node1 = node1 == null ? headB : node1.next;
                node2 = node2 == null ? headA : node2.next;
            }
      			//当两个链表没有交点的时候回同时走到 null,此时退出
            return node1;
        }
    
    
总结
  • 巧妙的想法看看就好
  • 链表时刻想起可以使用快慢指针
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值