leetcode:160 Intersection of Two Linked Lists-每日編程第二十九題

Intersection of Two Linked Lists

Total Accepted: 53988 Total Submissions: 181510 Difficulty: Easy

Write a program to find the node at which the intersection of two singly linked lists begins.


For example, the following two linked lists: 

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

begin to intersect at node c1.


Notes:

  • If the two linked lists have no intersection at all, return null.
  • The linked lists must retain their original structure after the function returns. 
  • You may assume there are no cycles anywhere in the entire linked structure.
  • Your code should preferably run in O(n) time and use only O(1) memory.
思路:
1).計算鏈headA的長度len1,鏈headB的長度len2。
2).如果鏈A與鏈B 有交集,那麼從最初的交點到兩條鏈的末尾的節點數必然是相等的。
3).當len1>len2時,從鏈A的頭節點遍歷len1-len2個節點,使得headA,headB到鏈尾的節點數相同。len2>len1時,則對鏈B進行遍歷。
4).最後,輪流比較節點直到null,判斷中間是否曾出現相等,相等則返回此節點值,否則,返回null。
/**
 * 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* p = headA;
        int len1 = 0;
        while(p!=NULL){
            len1++;
            p=p->next;
        }
        int len2=0;
        p = headB;
        while(p!=NULL){
            len2++;
            p=p->next;
        }
        if(len1<len2){
            while(len2!=len1){
                headB = headB->next;
                len2--;
            }
        }else if(len1>len2){
            while(len1!=len2){
                headA = headA->next;
                len1--;
            }
        }
        while(len1>0&&headA!=headB){
            headA = headA->next;
            headB = headB->next;
            len1--;
        }
        return headA;
    }
};



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章