Hot-Leecode 3:相交链表(283)

今天做一道链表的题目,对链表结构、链表遍历,两个链表的操作进行熟悉加深。

前置知识

  • 链表结构:包含值,以及指向下一节点的引用
//链表都包含值,以及指向下一节点的引用
public class ListNode {
      //存储值
      int val;
      //指向链表下一个节点
      ListNode next;
      ListNode(int x) {
         val = x;
         next = null;
     }
 }
  • 对链表进行遍历
ListNode current = head; // 从链表头部开始
while (current != null) {
    // 访问当前节点的值,例如打印节点值
    System.out.println(current.val);
    current = current.next; // 移动到下一个节点
}
  • 获取链表长度
//获取链表长度
    public static int getLinkedListLength(ListNode head) {
        int length = 0;
        ListNode current = head;

        while (current != null) {
            length++;
            current = current.next;
        }

        return length;
    }
  • 较长链表移动到和较短链表对齐
//较长链表的头节点向后移动到与较短链表对齐
             int lengthDiff = Math.abs(lengthA - lengthB); //计算长度差值
             if (lengthA > lengthB) {
                 while (lengthDiff > 0) {
                     headA = headA.next;
                     lengthDiff--;
                 }
             } else {
                 while (lengthDiff > 0) {
                     headB = headB.next;
                     lengthDiff--;
                 }
             }

思路&代码

  • 这里主要看到了这个图,listA比listB长,所以可以理解为先走listA走,走到两者长度一样的地方

public class Solution {

        //获取链表长度
        public static int getLinkedListLength(ListNode head) {
            int length = 0;
            ListNode current = head;

            while (current != null) {
                length++;
                current = current.next;
            }

            return length;
        }

        //第一个链表遍历,第二个链表遍历,如果两个链表没有值是一样的,证明不存在相交
         public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
            //获取链表长度
             int lengthA=getLinkedListLength(headA);
             int lengthB=getLinkedListLength(headB);

             //较长链表的头节点向后移动到与较短链表对齐
             int lengthDiff = Math.abs(lengthA - lengthB); //计算长度差值
             if (lengthA > lengthB) {
                 while (lengthDiff > 0) {
                     headA = headA.next;
                     lengthDiff--;
                 }
             } else {
                 while (lengthDiff > 0) {
                     headB = headB.next;
                     lengthDiff--;
                 }
             }
             //如果两个链表有一个为空,return null
            if(headA==null || headB==null){
                return null;
            }

            while (headA!=null&&headB!=null){
                //只有找到才返回headA
                if (headA==headB){
                    return headA;
                }else {
                    headA = headA.next;
                    headB = headB.next;
                }
            }
            //找不到节点
             return null;
         }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值