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

来源:互联网 发布:sql编程基础 编辑:程序博客网 时间:2024/06/10 03:39

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



0 0