版权声明:中华人民共和国持有版权 https://blog.csdn.net/Fly_Fly_Zhang/article/details/85319902
题目:相交链表
方法一常规解法思路:采用双指针先计算出两条链的长度,然后求出差值,先让长链走差值步,下来两条链的长度一样,然后开始比较,直到遇见相见的节点或者走完链表。
/**
* 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;
}
int len1=0;
int len2=0;
ListNode cur1=headA;
ListNode cur2=headB;
while(cur1.next!=null || cur2.next!=null){
if(cur1.next!=null){
cur1=cur1.next;
len1++;
}
if(cur2.next!=null){
cur2=cur2.next;
len2++;
}
}
if(cur1!=cur2){ //两个链表最后一个元素不相同
return null;
}
if(len1<len2){ //长链为cur1
cur1=headB;
cur2=headA;
int tmp=len1;
len1=len2;
len2=tmp;
}else{
cur1=headA;
cur2=headB;
}
int len=len1-len2;
while(cur1!=null){
if(len>0){
cur1=cur1.next;
len--;
continue;
}
if(cur1==cur2){
return cur1;
}else{
cur1=cur1.next;
cur2=cur2.next;
}
}
return null;
}
}
方法二巧妙解法思路:逻辑思路分为两轮,第一轮两个链表一个一步的走,如果两个链表的长度相等第一轮就可以直接判断出来;如果不相等第一轮结束,让cur1指向headB; cur2指向headA , 这个其实用的原理很简单;lenA+lenB=lenB+lenA; 也就是说当短链走完转长链继续走。长链走完转短链时,两个链剩余部分正好相等。
/**
* 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 cur1=headA;
ListNode cur2=headB;
while(cur1!=cur2){
cur1= cur1==null ? headB:cur1.next;
cur2= cur2==null ? headA:cur2.next;
}
return cur1;
}
}