lintcode 交叉链表

来源:互联网 发布:淘宝店铺资金被冻结 编辑:程序博客网 时间:2024/05/17 22:40

问题描述:

请写一个程序,找到两个单链表最开始的交叉节点。

思路:

一:1.通过两个栈将两个链表保存起来
       2.如果两个链表相交了那么刚弹出来的节点一定是相同的
       3.通过临时变量将刚开始弹出的两个节点保存起来
       4.开始遍历两个栈,栈中的元素两个临时变量分别更新。一个保存刚弹出来的节点另一个保存上一个弹出的节点
       5.如果一旦发现两个节点不一样。则上一个保存的节点就是交叉节点
       假设链表的长度分别是K和N时间复杂度为 O(n) 空间复杂度O(K+N)
二:1.先找到长的那个链表,看长链表比短链表长多少?记录下长度差。
       2.先让长链表走长度差的距离,此时再同时开始遍历
       3.第一次两个节点相同的时候那个节点就是交叉节点
       时间复杂度O(n) 空间复杂度O(1);
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {    // write your code here    int lenA=1;    int lenB=1;    ListNode *nodeA=headA;    ListNode *nodeB=headB;    while(nodeA!=NULL||nodeB!=NULL)    {        if(nodeA!=NULL)        {            lenA++;            nodeA=nodeA->next;        }        if(nodeB!=NULL)        {            lenB++;            nodeB=nodeB->next;        }    }    ListNode *nodeLong=lenA>lenB? headA:headB;    int cur=lenA>lenB? (lenA-lenB):(lenB-lenA);    while(cur--)    {                nodeLong=nodeLong->next;    }    ListNode *nodeLess=lenA>lenB? headB:headA;    while(nodeLess!=NULL&&nodeLong!=NULL)    {        if(nodeLong==nodeLess)        return nodeLess;        else        {            nodeLess=nodeLess->next;            nodeLong=nodeLong->next;        }    }    return NULL;}


原创粉丝点击