今天做一道链表的题目,对链表结构、链表遍历,两个链表的操作进行熟悉加深。
前置知识
- 链表结构:包含值,以及指向下一节点的引用
//链表都包含值,以及指向下一节点的引用
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;
}
}