SE註冊“皇家騎士團2:重生”商標 或將重製該作品
阿新 • • 發佈:2022-04-08
//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; } }