leetcode-160-相交链表(simple)
編寫一個(gè)程序,找到兩個(gè)單鏈表相交的起始節(jié)點(diǎn)。
如下面的兩個(gè)鏈表:
在節(jié)點(diǎn) c1 開始相交。
輸入: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)。從各自的表頭開始算起,鏈表 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)。
輸入: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)。從各自的表頭開始算起,鏈表 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)。
注意:
如果兩個(gè)鏈表沒有交點(diǎn),返回 null.
在返回結(jié)果后,兩個(gè)鏈表仍須保持原有的結(jié)構(gòu)。
可假定整個(gè)鏈表結(jié)構(gòu)中沒有循環(huán)。
程序盡量滿足 O(n) 時(shí)間復(fù)雜度,且僅用 O(1) 內(nèi)存。
java代碼:
解題思路:
方法1.我們通常做這種題的思路是設(shè)定兩個(gè)指針分別指向兩個(gè)鏈表頭部,一起向前走直到其中一個(gè)到達(dá)末端,另一個(gè)與末端距離則是兩鏈表的 長度差。再通過長鏈表指針先走的方式消除長度差,最終兩鏈表即可同時(shí)走到相交點(diǎn)。
方法2.換個(gè)方式消除長度差: 拼接兩鏈表。
設(shè)長-短鏈表為 C,短-長鏈表為 D (分別代表長鏈表在前和短鏈表在前的拼接鏈表),則當(dāng) C 走到長短鏈表交接處時(shí),D 走在長鏈表中,且與長鏈表頭距離為 長度差;
以下圖片幫助理解:當(dāng) ha == hb 時(shí)跳出,返回即可
public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {ListNode ha = headA, hb = headB;while (ha != hb) {ha = ha != null ? ha.next : headB;hb = hb != null ? hb.next : headA;}return ha;}
}
轉(zhuǎn)載于:https://www.cnblogs.com/fightingcode/p/11619144.html
總結(jié)
以上是生活随笔為你收集整理的leetcode-160-相交链表(simple)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JAVA中priorityqueue详解
- 下一篇: android studio 通过界面快