博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
160. Intersection of Two Linked Lists
阅读量:5277 次
发布时间:2019-06-14

本文共 2067 字,大约阅读时间需要 6 分钟。

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.
    找到相交的结点,很简单的题目,用双指针记录两个链表,如果相等则返回结点,如果没有则一直next下去,尽头没有next了就返回空。当其中一个指针走完的时候,就重定向到另外一个链表,这样子就可以让两个指针步数一致。在第二次迭代同时碰到交叉点结点。最后的时间复杂度是两个链表的长度之和,考虑最坏情况O(m+n)。例:A={1,2,3,4,5},B={6,7,8,3,4,5}。A的长度比B小,A先走完了,此时B走到4的位置,A重定向后在链表B的6的位置,此时B走到5,然后B重定向到A链表的位置1,最后两个指针距离交叉点3的步数一致。
    1 /** 2  * Definition for singly-linked list. 3  * struct ListNode { 4  *     int val; 5  *     struct ListNode *next; 6  * }; 7  */ 8 struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) { 9     if(!headA || !headB)    return NULL;10     struct ListNode *pa=headA,*pb=headB;11     while(1){12         if(pa==pb)  13             return pa;14         else if(!pa->next && !pb->next) 15             return NULL;16         else{17             if(pa->next)    18                 pa=pa->next;19             else    20                 pa=headB;21             if(pb->next)22                 pb=pb->next;23             else24                 pb=headA;25         }26     } 27 }

     

    看到别的大神更简洁的写法,同样的原理:
    1 /** 2  * Definition for singly-linked list. 3  * struct ListNode { 4  *     int val; 5  *     struct ListNode *next; 6  * }; 7  */ 8 struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) { 9     if(!headA || !headB)    return NULL;10     struct ListNode *pa=headA,*pb=headB;11     while(pa!=pb){12         pa=pa==NULL?headB:pa->next;13         pb=pb==NULL?headA:pb->next;14     }15     return pa;16 }

     

转载于:https://www.cnblogs.com/real1587/p/9886734.html

你可能感兴趣的文章
瞬间的永恒
查看>>
2019-8-5 考试总结
查看>>
JS中实现字符串和数组的相互转化
查看>>
web service和ejb的区别
查看>>
Windows Azure Cloud Service (29) 在Windows Azure发送邮件(下)
查看>>
CS61A Efficiency 笔记
查看>>
微信上传素材返回 '{"errcode":41005,"errmsg":"media data missing"}',php5.6返回
查看>>
div或者p标签单行和多行超出显示省略号
查看>>
Elasticsearch 滚动重启 必读
查看>>
Hadoop基本概念
查看>>
java.util.zip压缩打包文件总结一:压缩文件及文件下面的文件夹
查看>>
浅说 apache setenvif_module模块
查看>>
MySQL--数据插入
查看>>
重新学习python系列(二)? WTF?
查看>>
shell脚本统计文件中单词的个数
查看>>
SPCE061A学习笔记
查看>>
sql 函数
查看>>
hdu 2807 The Shortest Path 矩阵
查看>>
熟悉项目需求,要知道产品增删修改了哪些内容,才会更快更准确的在该项目入手。...
查看>>
JavaScript 变量
查看>>