相交链表解法一
編寫(xiě)一個(gè)程序,找到兩個(gè)單鏈表相交的起始節(jié)點(diǎn)。
如下面的兩個(gè)鏈表:
在節(jié)點(diǎn) c1 開(kāi)始相交。
示例 1:
輸入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3
輸出:Reference of the node with value = 8
輸入解釋:相交節(jié)點(diǎn)的值為 8 (注意,如果兩個(gè)列表相交則不能為 0)。從各自的表頭開(kāi)始算起,鏈表 A 為 [4,1,8,4,5],鏈表 B 為 [5,0,1,8,4,5]。在 A 中,相交節(jié)點(diǎn)前有 2 個(gè)節(jié)點(diǎn);在 B 中,相交節(jié)點(diǎn)前有 3 個(gè)節(jié)點(diǎn)。
示例 2:
輸入:intersectVal = 2, listA = [0,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1
輸出:Reference of the node with value = 2
輸入解釋:相交節(jié)點(diǎn)的值為 2 (注意,如果兩個(gè)列表相交則不能為 0)。從各自的表頭開(kāi)始算起,鏈表 A 為 [0,9,1,2,4],鏈表 B 為 [3,2,4]。在 A 中,相交節(jié)點(diǎn)前有 3 個(gè)節(jié)點(diǎn);在 B 中,相交節(jié)點(diǎn)前有 1 個(gè)節(jié)點(diǎn)。
示例 3:
輸入:intersectVal = 0, listA = [2,6,4], listB = [1,5], skipA = 3, skipB = 2
輸出:null
輸入解釋:從各自的表頭開(kāi)始算起,鏈表 A 為 [2,6,4],鏈表 B 為 [1,5]。由于這兩個(gè)鏈表不相交,所以 intersectVal 必須為 0,而 skipA 和 skipB 可以是任意值。
解釋:這兩個(gè)鏈表不相交,因此返回 null。
注意:
如果兩個(gè)鏈表沒(méi)有交點(diǎn),返回 null.
在返回結(jié)果后,兩個(gè)鏈表仍須保持原有的結(jié)構(gòu)。
可假定整個(gè)鏈表結(jié)構(gòu)中沒(méi)有循環(huán)。
程序盡量滿足 O(n) 時(shí)間復(fù)雜度,且僅用 O(1) 內(nèi)存。
來(lái)源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/intersection-of-two-linked-lists
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。
思路:根據(jù)(a+b).length=(b+a).length
第一輪后若不相同,指針指向另一個(gè)鏈表的頭結(jié)點(diǎn)
思路來(lái)源于力扣大神SEU.FidGet
public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {/**定義兩個(gè)指針, 第一輪讓兩個(gè)到達(dá)末尾的節(jié)點(diǎn)指向另一個(gè)鏈表的頭部, 最后如果相遇則為交點(diǎn)(在第一輪移動(dòng)中恰好抹除了長(zhǎng)度差)兩個(gè)指針等于移動(dòng)了相同的距離, 有交點(diǎn)就返回, 無(wú)交點(diǎn)就是各走了兩條指針的長(zhǎng)度**/if(headA == null || headB == null) return null;ListNode pA = headA, pB = headB;// 在這里第一輪體現(xiàn)在pA和pB第一次到達(dá)尾部會(huì)移向另一鏈表的表頭, 而第二輪體現(xiàn)在如果pA或pB相交就返回交點(diǎn), 不相交最后就是null==nullwhile(pA != pB) {pA = pA == null ? headB : pA.next;pB = pB == null ? headA : pB.next;}return pA;} }總結(jié)
- 上一篇: python set 随机_python
- 下一篇: 分析方法的基础 — 3. 业务与管理的特