LeetCode 160 Intersection of Two Linked Lists 求两个链表的交点

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

第一种:分别遍历两个链表,得到分别对应的长度。然后求长度的差值,把较长的那个链表向后移动这个差值的个数,然后一一比较即可。

/**
 * 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 *node1=headA;
        ListNode *node2=headB;
        if(node1==NULL||node2==NULL) return NULL;
        int len1=length(headA);
        int len2=length(headB);
        printf("%d %d\n",len1,len2);
        if(len1<len2)
        {
            for(int i=0;i<len2-len1;i++)
               node2=node2->next;
        }
        else if(len1>len2)
        {
           
            for(int i=0;i<len1-len2;i++)//低级错误,我竟然写的len2-len1;看清楚谁大谁小;找错误找了半天真是愚蠢  
                node1=node1->next;
        }
        while(node1!=NULL&&node2!=NULL)
        {
            if(node1==node2)
                return node1;   
            node1=node1->next;
            node2=node2->next;
        }
         return NULL;
    }
    int length(ListNode *head)
    {
        int ans=0;
        while(head!=NULL)
        {
            ans++;
            head=head->next;
        }
        return ans;
    }
};

第二种:

这道题还有一种特别巧妙的方法,虽然题目中强调了链表中不存在环,但是我们可以用环的思想来做,我们让两条链表分别从各自的开头开始往后遍历,当其中一条遍历到末尾时,我们跳到另一个条链表的开头继续遍历。两个指针最终会相等,而且只有两种情况,一种情况是在交点处相遇,另一种情况是在各自的末尾的空节点处相等。为什么一定会相等呢,因为两个指针走过的路程相同,是两个链表的长度之和,所以一定会相等。(简单高效)

class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        ListNode *node1=headA;
        ListNode *node2=headB;
        while(1)
        {
            if(node1==node2) return node1;
            node1=node1?node1->next:headB;
            node2=node2?node2->next:headA;
        }
    }
   
};

猜你喜欢

转载自blog.csdn.net/momo_mo520/article/details/80376741