leetcode--【160】相交連結串列
阿新 • • 發佈:2021-02-07
題目:相交連結串列
編寫一個程式,找到兩個單鏈表相交的起始節點。
如下面的兩個連結串列:
在節點 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
輸入解釋:相交節點的值為 8 (注意,如果兩個連結串列相交則不能為 0)。從各自的表頭開始算起,連結串列 A 為 [4,1,8,4,5],連結串列 B 為 [5,0,1,8,4,5]。在 A 中,相交節點前有 2 個節點;在 B 中,相交節點前有 3 個節點。
題解:
方法1:暴力解法
step1:如果A或者B為空,直接返回null
step2:遍歷A連結串列;
step3:遍歷B連結串列;
step4:在對應的每一個A的節點都去B中尋找是否有相同的
時間複雜度:O(n*m)
/** * Definition for singly-linked list. * function ListNode(val) { * this.val = val; * this.next = null; * } */ /** * @param {ListNode} headA * @param {ListNode} headB * @return {ListNode} */ var getIntersectionNode = function(headA, headB) { //暴力解法 if(!headA || !headB) return null let pA = headA while(pA){ let pB = headB while(pB){ if(pA == pB) return pA pB = pB.next } pA = pA.next } };
方法2:雙指標
step1:如果A連結串列為空或者B連結串列為空,則直接返回null;
step2:定義一個指標pA,一個指標pB,分別遍歷A連結串列、B連結串列
step3:假設A指標較長,B遍歷完後,pB指向A連結串列遍歷;
step4:A指標遍歷完後,指向B連結串列遍歷
step5:二者相遇,則是所求公共點的
時間複雜度:O(n)
/** * Definition for singly-linked list. * function ListNode(val) { * this.val = val; * this.next = null; * } */ /** * @param {ListNode} headA * @param {ListNode} headB * @return {ListNode} */ var getIntersectionNode = function(headA, headB) { //雙指標 if(!headA || !headB) return null let pA = headA; let pB = headB; while(pA != pB){ //如果A連結串列,沒有遍歷完,接著遍歷,若遍歷完了,遍歷B連結串列,直到二者重合 pA = pA === null ? headB:pA.next; pB = pB === null ? headA:pB.next; } return pA; };
方法3:設定標記
step1:遍歷A連結串列,給一個節點做上標記;
step2:遍歷B連結串列,判斷節點是否有標記,如果有,直接返回
時間複雜度:O(n)
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} headA
* @param {ListNode} headB
* @return {ListNode}
*/
var getIntersectionNode = function(headA, headB) {
//標記法
if(!headA || !headB) return null
let pA = headA;
let pB = headB;
while(pA){
pA.flag = true;
pA = pA.next
}
while(pB){
if(pB.flag) return pB;
pB = pB.next;
}
};