1. 程式人生 > 遊戲 >SE註冊“皇家騎士團2:重生”商標 或將重製該作品

SE註冊“皇家騎士團2:重生”商標 或將重製該作品

//20220411
題目描述:
給你兩個單鏈表的頭節點 headA 和 headB ,請你找出並返回兩個單鏈表相交的起始節點。如果兩個連結串列不存在相交節點,返回 null 。
題目連結

解題思路:

  • 我們首先設定兩個指標,第一個指標指向headA(indexA),第二個指標指向headB(indexB),然後兩個指標同時遍歷,如果indexA遍歷到結尾時等於null,則讓indexA指向headB(indexB遍歷到結尾也同樣操作),然後繼續遍歷,在indexA==indexB時,返回指向結點(該節點為相交的第一個結點,或者為空)
  • 證明:我們設兩個連結串列相交前的結點數分別為a、b,設相交部分有c個結點,所以indexA遍歷到結尾時走的距離為a+c,同理indexB遍歷到結尾時走的距離為b+c,當我們在indexA和indexB遍歷完成時做indexA=headB或者indexB=headA操作時,二者第二次到達交點時的距離為a+c+b、b+c+a,可以發現,二者相等了!所以進行此操作後,二者必會在第二次到達連結串列交點時相遇,此時返回就行
    • 另,如果連結串列無交點且不一樣長,二者在進行交換後會同時到達結尾,最終返回的是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 index_a = headA;
        ListNode index_b = headB;
        while(index_a==null||index_b==null)return null;

        while(index_a!=index_b){
            index_a = index_a==null?headB:index_a.next;
            index_b = index_b==null?headA:index_b.next;
        }

        return index_a;
    }
}