• 剑指52 两个链表的第一个公共节点


    输入两个链表,找出它们的第一个公共节点。

    普通办法,对A链表每个节点都遍历B链表,看有没有相同,时间复杂度mn。

    用空间换时间,因为链表只要遇到第一个相同的节点,后面的节点都相同,也就是说可以从链表尾往回找。但是因为缺乏往回的指针,所以使用栈,两个栈分别把两个链表的所有节点压进去,然后再一对一对弹出并检查,时间复杂度max(m,n),需要m+n的辅助空间。

    其实这也可以使用双指针,两个指针保持相同的距离。先遍历一遍两个链表记录他们的长度,长度差为diff,让长的那一侧先走diff,然后两个同步前进,遇到的第一个相同的节点就是答案。

     1 /**
     2  * Definition for singly-linked list.
     3  * struct ListNode {
     4  *     int val;
     5  *     ListNode *next;
     6  *     ListNode(int x) : val(x), next(NULL) {}
     7  * };
     8  */
     9 class Solution {
    10 public:
    11     ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
    12         if(headB==nullptr || headA==nullptr)
    13             return nullptr;
    14         ListNode* dummyA=headA,*dummyB=headB;
    15         int lena=0,lenb=0;
    16         while(headA!=nullptr){
    17             headA=headA->next;
    18             lena++;
    19         }
    20         while(headB!=nullptr){
    21             headB=headB->next;
    22             lenb++;
    23         }
    24         int diff=lenb-lena;
    25         while(diff>0){
    26             dummyB=dummyB->next;
    27             diff--;
    28         }
    29         while(diff<0){
    30             dummyA=dummyA->next;
    31             diff++;
    32         }
    33         while(dummyA!=nullptr){
    34             if(dummyA==dummyB)
    35                 break;
    36             dummyA=dummyA->next;
    37             dummyB=dummyB->next;
    38         }
    39         return dummyB;
    40     }
    41 };
  • 相关阅读:
    silverlight重写TextBox PassWordBox
    android使用html开发
    SilverLight中DataGrid显示值转换
    STM32 GPIO 的配置与使用
    开始。。
    VCS使用指令
    【转】关闭 Windows 7中的 6to4 隧道
    DC中关于list、双引号和花括号的使用区别
    解决了microblaze在ISE中例化时自动插入IO buffer
    Recovery time 和 Removal time的概念
  • 原文地址:https://www.cnblogs.com/rookiez/p/13253234.html
Copyright © 2020-2023  润新知