设为首页 加入收藏

TOP

[LeetCode从零单刷]Intersection of Two Linked Lists
2015-11-21 00:55:03 来源: 作者: 【 】 浏览:1
Tags:LeetCode 从零单 Intersection Two Linked Lists

题目:

?

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.

解答:

需要的是常量级别的空间,而且时间是遍历的时间(可以常数次的多次遍历)。

因为是单链表,所以没办法从尾部开始回搜到第一个不相同的节点。那能不能从头部开始搜到第一个相同的节点?

好像不行,因为链表的长度各不相同。如果是长度相同的链表就可以了。我们截掉更长的链表的头几个多余元素。

如果我可以知道两者的链表长度,长度通过遍历链表得到。

?

/**
 * 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* ha = headA;
        ListNode* hb = headB;
        int lenA = 0;
        int lenB = 0;
        
        while(ha != NULL) {ha = ha->next; lenA++;}
        while(hb != NULL) {hb = hb->next; lenB++;}
        ha = headA;
        hb = headB;
        
        if(lenA > lenB) {
            int diff = lenA - lenB;
            while(diff--)   ha = ha->next;
        }
        
        if(lenB > lenA) {
            int diff = lenB - lenA;
            while(diff--)   hb = hb->next;
        }
        
        while(ha) {
            if(ha == hb)    return ha;
            ha = ha->next;
            hb = hb->next;
        }
        return NULL;
    }
};

?

?

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇LeetCode 28 Implement strStr() 下一篇LeetCode 26 Remove Duplicates f..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: