随笔-相交链表(巧妙解法)

版权声明:中华人民共和国持有版权 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;
    }
}

猜你喜欢

转载自blog.csdn.net/Fly_Fly_Zhang/article/details/85319902