LeetCode: Intersection of Two Linked Lists

来源:互联网 发布:印度同志聊天软件 编辑:程序博客网 时间:2024/05/01 07:23

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; *     struct ListNode *next; * }; */struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {        if (headA == NULL || headB == NULL) return NULL;    struct ListNode* tmpA = headA;    struct ListNode* tmpB = headB;    int cntA = 1;    int cntB = 1;    while(tmpA->next != NULL) {        cntA++;        tmpA = tmpA->next;    }        while(tmpB->next != NULL) {        cntB++;        tmpB = tmpB->next;    }        if (tmpA != tmpB) return NULL;    tmpA = headA;    tmpB = headB;        while(cntA > 0) {        if (cntA > cntB) {            tmpA = tmpA->next;            cntA--;        }        else if (cntB > cntA) {            tmpB = tmpB->next;            cntB--;        }        else {            while(tmpA != NULL) {                if (tmpA == tmpB) return tmpA;                else {                    tmpA = tmpA->next;                    tmpB = tmpB->next;                }            }        }    }        return NULL;    }



1 0
原创粉丝点击