1. 程式人生 > >隨筆-相交連結串列(巧妙解法)

隨筆-相交連結串列(巧妙解法)

題目:相交連結串列

方法一常規解法思路:採用雙指標先計算出兩條鏈的長度,然後求出差值,先讓長鏈走差值步,下來兩條鏈的長度一樣,然後開始比較,直到遇見相見的節點或者走完連結串列。

/**
 * 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;
    }
}