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;
    }
};



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