总算开始了第一次的博客。内心战战兢兢o(╥﹏╥)o
下面来自LeetCode的一道链表题。
题目描述:
编写一个程序,找到两个单链表相交的起始节点。
如下面的两个链表:
在节点 c1 开始相交。
注意:
1.如果两个链表没有交点,返回 null.
2.在返回结果后,两个链表仍须保持原有的结构。
3.可假定整个链表结构中没有循环。
4.程序尽量满足 O(n) 时间复杂度,且仅用 O(1) 内存。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/intersection-of-two-linked-lists
解题思路:
刚拿到题目,想的是对A的每一个结点,遍历B并且寻找第一个相同的结点,时间复杂度为O(mn)!!!!
但题目要求时间复杂度为O(n),然后再想一下,................
思路大概是对AB两个链表分别遍历进行比较,但是必须是相同长度的链表,那么就先把长链表在与短链表相交前多出来的部分截掉,所以就是先求长度,将长链表在(长链表.length - 短链表.length)处开始遍历,短链表从头遍历,然后相同时就是相交的结点处,返回,如果两个链表没有相交,则两指针最终都指向Null,则返回Null,Over~
我的代码:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public static int getLength(ListNode head){
int count=0;
ListNode cur=head;
while(cur!=null){
cur=cur.next;
count++;
}
return count;
}
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
int a=getLength(headA);
int b=getLength(headB);
ListNode cur1=headA;
ListNode cur2=headB;
if(a>=b){
for(int i=0;i<a-b;i++){
cur1=cur1.next;
}
}else{
for(int i=0;i<b-a;i++){
cur2=cur2.next;
}
}
while(cur1!=null&&cur1!=cur2){
cur1=cur1.next;
cur2=cur2.next;
}
return cur1;
}
}
看着自己的代码,emmmmmmmm,自我感觉良好,然后秉着学习的态度,就去评论区逛了一下,噗,果然我就是个萌新。
大佬的优雅代码:
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if (headA == null || headB == null) return null;
ListNode pA = headA, pB = headB;
while (pA != pB) {
pA = pA == null ? headB : pA.next;
pB = pB == null ? headA : pB.next;
}
return pA;
}
原理应该就是,利用(a+b).length=(b+a).length,a是链表A除相交部分,b是链表B除相交部分。这段代码不仅省去了求长度差的时间,代码本身还简洁了不少,简直赏心悦目。
小萌新膝盖奉上。
感受:
最近总算知道要开始好好学习了,突然感觉学习的感觉真的炒鸡棒,理解了任何一点知识都会有一丝小开心~快让我沉浸于学习
这是博主第一次写博客,因为刚学Java不久,所以可能会有一些知识的欠缺导致一些错误,看到麻烦各位大佬在线指导~