剑指 Offer 52. 两个链表的第一个公共节点(C语言)
*輸入兩個鏈表,找出它們的第一個公共節(jié)點(diǎn)。
如下面的兩個鏈表:
在節(jié)點(diǎn) c1 開始相交。
示例 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 (注意,如果兩個列表相交則不能為 0)。從各自的表頭開始算起,鏈表 A 為 [4,1,8,4,5],鏈表 B 為 [5,0,1,8,4,5]。在 A 中,相交節(jié)點(diǎn)前有 2 個節(jié)點(diǎn);在 B 中,相交節(jié)點(diǎn)前有 3 個節(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 (注意,如果兩個列表相交則不能為 0)。從各自的表頭開始算起,鏈表 A 為 [0,9,1,2,4],鏈表 B 為 [3,2,4]。在 A 中,相交節(jié)點(diǎn)前有 3 個節(jié)點(diǎn);在 B 中,相交節(jié)點(diǎn)前有 1 個節(jié)點(diǎn)。
示例 3:
輸入:intersectVal = 0, listA = [2,6,4], listB = [1,5], skipA = 3, skipB = 2
輸出:null
輸入解釋:從各自的表頭開始算起,鏈表 A 為 [2,6,4],鏈表 B 為 [1,5]。由于這兩個鏈表不相交,所以 intersectVal 必須為 0,而 skipA 和 skipB 可以是任意值。
解釋:這兩個鏈表不相交,因此返回 null。
注意:
如果兩個鏈表沒有交點(diǎn),返回 null.
在返回結(jié)果后,兩個鏈表仍須保持原有的結(jié)構(gòu)。
可假定整個鏈表結(jié)構(gòu)中沒有循環(huán)。
程序盡量滿足 O(n) 時間復(fù)雜度,且僅用 O(1) 內(nèi)存。*
這道題主要就是通過兩個指針走兩個鏈表直到相交,主要思路可以這樣理解:相交之前的鏈表部分分別為L1和L2,c是他們兩個的公共部分,令指針p指向head1,q指向head2,p走完鏈表1后走了L1+c的長度,然后讓L1指向head2,q走完鏈表2后走了L2+c的長度,然后讓L2指向head1,p,q分別繼續(xù)走L2和L1,最終相遇,都走了相同長度,p走了L1+c+L2,q走了L2+c+L1;
看到了一個有趣的回答:
代碼如下:
總結(jié)
以上是生活随笔為你收集整理的剑指 Offer 52. 两个链表的第一个公共节点(C语言)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 876. 链表的中间结点(C语言)
- 下一篇: 21. 合并两个有序链表(C语言)