1. 程式人生 > 其它 >160. 相交連結串列 力扣(簡單) 連結串列題總有點不熟練

160. 相交連結串列 力扣(簡單) 連結串列題總有點不熟練

題目描述:

給你兩個單鏈表的頭節點headA 和 headB ,請你找出並返回兩個單鏈表相交的起始節點。如果兩個連結串列沒有交點,返回 null 。

圖示兩個連結串列在節點 c1 開始相交:

題目資料 保證 整個鏈式結構中不存在環。

注意,函式返回結果後,連結串列必須 保持其原始結構 。

題源:https://leetcode-cn.com/problems/intersection-of-two-linked-lists/

程式碼:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
      /*ListNode *res=NULL;
      while(headA!=NULL)
      {
          ListNode *h=headB;
          while(h!=NULL)
        {
            if (h==headA){res=headA; break;}
            h=h->next;
        }
        if (res!=NULL) break;
        headA=headA->next;
      }
      return res;*/  //暴力法一
      int l1=0,l2=0;
      ListNode *t=headA,*res=NULL;
      while (t!=NULL)
      {
          l1++;
          t=t->next;
      }
      t=headB;
      while (t!=NULL)
      {
          l2++;
          t=t->next;
      }
      if(l2>l1) {t=headA; headA=headB; headB=t; swap(l1,l2);}
      for(int i=1;i<=l1-l2;i++)  headA=headA->next;
      while(headA!=NULL)
      {
          if (headA==headB) {res=headB; break;}
          headA=headA->next;
          headB=headB->next;
      }
      return res;
    }  // 統計兩個連結串列的長度,讓長連結串列走完差值,再一起向後推動
};