1、题目: 链表相交
LeetCode对应题目链接https://leetcode.cn/problems/intersection-of-two-linked-lists-lcci/
在做的过程中一开始看题是完全混乱,不知道该如何实现,然后顺着题解的思路,一点一点的写下实现过程,自己写的过程无法通过,但是这些流程方便进行理解。
这道题要注意的点:需要找到相交的第一个结点,也就是两个指向这一结点的指针相同,不是值相同,而是指向的结点同。
自己根据理解的实现过程:
/**
* 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) {
//先给出指向两个链表头结点的指针,从头结点开始遍历
ListNode curA=headA;
ListNode curB=headB;
//声明两个链表的长度;
int lenA=0;
int lenB=0;
//声明链表长度差
int temp=0;
//从头开始遍历获取到两个链表的长度
while(curA!=null){
lenA++;
curA=curA.next;
}
while(curB!=null){
lenB++;
curB=curB.next;
}
//在获得长度后,将指针再次声明在两链表的头结点位置
curA=headA;
curB=headB;
/**
现在需要对长度条件进行判断,若长度不一,需要求长度差,然后使得长
链表的“头结点”换位置到和短链表从头结点开始一样的长度
*/
temp=lenA-lenB;
int temp1=Math.abs(temp);
if(temp>0){
for(int i=0;i<=temp;i++){
curA=curA.next;
}
}else{
for(int j=0;j<=temp1;j++){
curB=curB.next;
}
}
while(curA!=null&&curB!=null){
if(curA==curB){
//当相等时返回其中一个指针就好了,因为接下来的结点就是交点
return curA;
}
curA=curA.next;
curB=curB.next;
}
//当没有交点时返回空
return null;
}
}
运行通过的实现过程:
/**
* 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) {
//先给出指向两个链表头结点的指针,从头结点开始遍历
ListNode curA=headA;
ListNode curB=headB;
//声明两个链表的长度;
int lenA=0;
int lenB=0;
//声明链表长度差
int temp=0;
//从头开始遍历获取到两个链表的长度
while(curA!=null){
lenA++;
curA=curA.next;
}
while(curB!=null){
lenB++;
curB=curB.next;
}
//在获得长度后,将指针再次声明在两链表的头结点位置
curA=headA;
curB=headB;
/** 自己实现的这一段会有很多bug
现在需要对长度条件进行判断,若长度不一,需要求长度差,然后使得长
链表的“头结点”换位置到和短链表从头结点开始一样的长度
temp=lenA-lenB;
int temp1=Math.abs(temp);
if(temp>0){
for(int i=0;i<=temp;i++){
curA=curA.next;
}
}else{
for(int j=0;j<=temp1;j++){
curB=curB.next;
}
}
*/
/**
按照答案的思路,这里是不分开对链表的长度进行判断,直接使lenA是最长的,
若成立就直接当lenA是最长的进行下一步,若不是首先需要变成lenA是最长的
*/
if(lenB>lenA){
//变长度
int templeng=lenA;
lenA=lenB;
lenB=templeng;
//变位置
ListNode tempo=curA;
curA=curB;
curB=tempo;
}
//都是遍历到同一个位置,为什么我使用for循环发生错误呢?
temp=lenA-lenB;
while(temp-->0){
curA=curA.next;
}
while(curA!=null){
if(curA==curB){
return curA;
}
curA=curA.next;
curB=curB.next;
}
//当没有交点时返回空
return null;
}
}
思考(链表相交):在自己完成的与题解最大的不同之处是对于长度的判断,我是选择将所有情况列举出来,那么就会设计到几个for循环;而题解的是就规定一种情况,无论如何都是lenA长,按照这个条件去完成,如果不是,那么将A与B进行长度的替换,还有位置的替换,之后就一直按照A长来进行剩下操作流程。