1. 程式人生 > >LeetCode 相交鏈表

LeetCode 相交鏈表

分享圖片 時間 png linked 編寫一個程序 鏈表結構 復雜 bubuko ==

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

例如,下面的兩個鏈表:

A:          a1 → a2
                   ↘
                     c1 → c2 → c3
                   ↗            
B:     b1 → b2 → b3

在節點 c1 開始相交。

註意:

  • 如果兩個鏈表沒有交點,返回 null.
  • 在返回結果後,兩個鏈表仍須保持原有的結構。
  • 可假定整個鏈表結構中沒有循環。
  • 程序盡量滿足 O(n) 時間復雜度,且僅用 O(1) 內存。

方法一:

技術分享圖片

 1 /* C++ */
 2 /*
* 3 * Definition for singly-linked list. 4 * struct ListNode { 5 * int val; 6 * ListNode *next; 7 * ListNode(int x) : val(x), next(NULL) {} 8 * }; 9 */ 10 class Solution { 11 public: 12 ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { 13 if(headA == NULL || headB == NULL){
14 return NULL; 15 } 16 ListNode *a = headA; 17 ListNode *b = headB; 18 // 計算A和B的長度 19 int lenA = 0,lenB = 0; 20 while(a->next != NULL){ 21 a = a->next; 22 lenA++; 23 } 24 while(b->next != NULL){
25 b = b->next; 26 lenB++; 27 } 28 int step = lenB - lenA; 29 if(step>0){ 30 //說明B長 31 a = headB; 32 b = headA; 33 }else{// 說明A長 34 a = headA; 35 b = headB; 36 step *= -1; 37 } 38 while(step -- ){ 39 a = a->next; 40 } 41 while(a != b){ 42 a = a->next;b = b->next; 43 } 44 return a; 45 } 46 };

LeetCode 相交鏈表