LeetCode OJ 160. Intersection of Two Linked Lists
来源:互联网 发布:美拍怎么加淘宝链接 编辑:程序博客网 时间:2024/04/28 11:38
LeetCode OJ 160. Intersection of Two Linked Lists
Description
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.
Note:
- 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.
方法一
比较简单直观的一个思路:计算链表长度,然后长的链表指针先走,直到剩下长度等于短的链表长度,然后两个链表指针一起移动,直到两个指针相遇,就返回。
两个指针遍历两次链表,算两个链表长度为m,n,那么时间复杂度为O(m+n),空间复杂度为O(1),只用了几个变量用于求链表长度并保存下来。
代码
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: int getLen(ListNode *head){ int l = 0; while(head){ head = head->next; l ++; } return l; } ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { int lenA, lenB; lenA = getLen(headA); lenB = getLen(headB); if(lenA < lenB){ int temp = lenA; lenA = lenB; lenB = temp; ListNode *node = headA; headA = headB; headB = node; } while(lenA > lenB) { headA = headA->next; lenA --; } while(headA !=NULL && headA != headB){ headA = headA->next; headB = headB->next; } return headA; }};
方法二
两个指针p,q分别指向两个链表表头,然后分别每次移动一个节点来遍历两个链表。如果链表A到了尾节点,则指向链表B的头节点;同理,如果链表B到了尾节点也指向A的表头。这样p,q走过的路程最坏的情况就是两个链表的长度(m+n),如果p,q相遇的话,就是那个相遇的节点。所以时间复杂度为O(m+n),空间复杂度为O(1)。
代码
个人github代码链接
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { ListNode *p,*q; p = headA; q = headB; if(p == NULL || q == NULL) return NULL; while(p && q && p != q){ p = p->next; q = q->next; if(p == q) return p; if(p == NULL) p = headB; if(q == NULL) q = headA; } return p; }};
0 0
- LeetCode OJ Intersection of Two Linked Lists
- <LeetCode OJ> 160. Intersection of Two Linked Lists
- LeetCode OJ 160. Intersection of Two Linked Lists
- [LeetCode]160.Intersection of Two Linked Lists
- LeetCode 160. Intersection of Two Linked Lists
- 【LeetCode】160.Intersection of Two Linked Lists
- [leetcode] 160.Intersection of Two Linked Lists
- [LeetCode]160. Intersection of Two Linked Lists
- LeetCode--160. Intersection of Two Linked Lists
- LeetCode 160. Intersection of Two Linked Lists
- 【LeetCode】160. Intersection of Two Linked Lists
- Leetcode 160. Intersection of Two Linked Lists
- LeetCode *** 160. Intersection of Two Linked Lists
- LeetCode 160. Intersection of Two Linked Lists
- leetcode-160. Intersection of Two Linked Lists
- LeetCode-160.Intersection of Two Linked Lists
- LeetCode 160. Intersection of Two Linked Lists
- Leetcode 160. Intersection of Two Linked Lists
- 用户登录时启动
- 图片验证码
- 路由器WAN口和LAN口详解
- Xtrabackup用法
- 二叉树泛型 C#实现
- LeetCode OJ 160. Intersection of Two Linked Lists
- Mysql学习笔记
- Linux shell脚本实现kill进程
- saltstack 执行cp.get_file没有反应,salt-minion-The Salt Master has rejected this minion's
- 第二章 操作系统结构
- 6.scala中的包
- Apache Struts2(S2-046)漏洞利用
- Python爬虫 模拟登录
- Java格式化日期