1. 程式人生 > >LeetCode160-------相交連結串列(java)

LeetCode160-------相交連結串列(java)

題目中文連結
編寫一個程式,找到兩個單鏈表相交的起始節點。

例如,下面的兩個連結串列:
在這裡插入圖片描述

節點 c1 開始相交。

注意:

如果兩個連結串列沒有交點,返回 null.
在返回結果後,兩個連結串列仍須保持原有的結構。
可假定整個連結串列結構中沒有迴圈。
程式儘量滿足 O(n) 時間複雜度,且僅用 O(1) 記憶體。

解題思路:
1.先分別計算兩個連結串列a和b的長度,長度差記為lena-lenb(假設a比b長)
2.長度大的a 從頭節點先走lena-lenb個長度,這時a和b一樣長
3.然後挨個節點進行比較

程式碼:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
    int lena = 0;
    int lenb = 0;
    ListNode tempa = headA;
    ListNode tempb = headB;
    while(tempa != null){
        lena++;
        tempa = tempa.next;
    }
    while(tempb != null){
        lenb++;
        tempb = tempb.next;
    }
    tempa = headA;
    tempb = headB;
    if(lena > lenb){
        for (int i = 0; i < lena-lenb; i++) {
            tempa = tempa.next;
        }
    }
    else{
        for (int i = 0; i < lenb-lena; i++) {
            tempb = tempb.next;
        }
    }
    while(tempa != null &&  tempb != null && tempa.val != tempb.val){
        tempa = tempa.next;
        tempb = tempb.next;
    }
    return tempa;

}