1. 程式人生 > 其它 >leetcode--【160】相交連結串列

leetcode--【160】相交連結串列

技術標籤:leetcodeleetcode

題目:相交連結串列

編寫一個程式,找到兩個單鏈表相交的起始節點。

如下面的兩個連結串列

在節點 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;
    }
};