LeetCode 160. 相交链表

LeetCode 160. 相交链表_第1张图片
求两个单链表的相交的起始节点,很容易想到用暴力法,把A链表中的每一个节点放到B链表中比较,寻找有没有相同的节点,但这么做时间复杂度明显过高,达到了O(mn),m、n分别为A、B两链表的节点个数,这不是一个优秀的算法。
既然是LeetCode上的题,一定有时间复杂度更低的方法。但我思来想去就是想不出,看了题解才若有所悟。
可以考虑用两个指针PA,PB,分别指向A与B的头结点,然后让这两个指针分别向后遍历。若其中一个指针指向了链表末尾,则让他重新指向另一个链表的头结点。直到PA与PB相等,结束循环,若PA与PB均为NULL,则两个链表不相交,否则PA或PB的值就是两个链表相交的起始节点。
这是个非常巧妙的方法,可以将时间复杂度优化到(m+n),m、n分别为A、B两链表的节点个数。
这个算法其实也很浪漫,错的人迟早会走散,而对的人迟早会相逢!
双指针法:

/**
 * 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) {
        if(!headA || !headB)    return NULL;
        ListNode *pa=headA, *pb=headB;
        while(pa != pb){
            pa= pa==NULL? headB: pa->next;
            pb= pb==NULL? headA: pb->next;
        }
        return pa;
    }
};

你可能感兴趣的:(LEETCODE,算法,数据结构,leetcode,链表)